<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)整理與復(fù)習(xí)總結(jié)

          共 8891字,需瀏覽 18分鐘

           ·

          2020-10-15 20:19

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

          ? 作者?|??Chiakiiii

          來(lái)源 |? urlify.cn/IbmYbe

          66套java從入門(mén)到精通實(shí)戰(zhàn)課程分享

          1、數(shù)據(jù)庫(kù)底層

          MySQL數(shù)據(jù)庫(kù)的底層是B+樹(shù)。說(shuō)到B+樹(shù),先說(shuō)下B樹(shù),B樹(shù)也叫多路平衡查找樹(shù),所有的葉子節(jié)點(diǎn)位于同一層,具有以下特點(diǎn):1)一個(gè)節(jié)點(diǎn)可以容納多個(gè)值;2)除非數(shù)據(jù)已滿,不會(huì)增加新的層,B樹(shù)追求最少的層數(shù);3)子節(jié)點(diǎn)中的值與父節(jié)點(diǎn)的值有嚴(yán)格的大小對(duì)應(yīng)關(guān)系。一般來(lái)說(shuō),如果父節(jié)點(diǎn)有a個(gè)值,那么就有a+1個(gè)子節(jié)點(diǎn);4)關(guān)鍵字集合分布在整棵樹(shù)中;5)任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)節(jié)點(diǎn)中;6)搜索可能在葉子結(jié)點(diǎn)結(jié)束,其搜索性能等價(jià)于在關(guān)鍵字全集做一次二分查找。

          B+樹(shù)是基于B樹(shù)和葉子節(jié)點(diǎn)順序訪問(wèn)指針進(jìn)行實(shí)現(xiàn),它具有B樹(shù)的平衡性,并且通過(guò)順序訪問(wèn)指針來(lái)提高區(qū)間查詢的性能,一個(gè)葉子節(jié)點(diǎn)中的key從左至右非遞減排列。特點(diǎn)在于:1)非葉子節(jié)點(diǎn)中含有n個(gè)關(guān)鍵字,關(guān)鍵字不保存數(shù)據(jù),只作為索引,所有數(shù)據(jù)都保存在葉子結(jié)點(diǎn);2)有的葉子節(jié)點(diǎn)中包含了全部關(guān)鍵字的信息及只想這些關(guān)鍵字記錄的指針,即葉子節(jié)點(diǎn)包含鏈表結(jié)構(gòu),能夠方便進(jìn)行區(qū)間查詢;3)所有的非葉子結(jié)點(diǎn)可以看成是索引部分,節(jié)點(diǎn)中僅包含其子樹(shù)中的最大(或最小)關(guān)鍵字;4)同一個(gè)數(shù)字會(huì)在不同節(jié)點(diǎn)中重復(fù)出現(xiàn),根節(jié)點(diǎn)的最大元素就是B+樹(shù)的最大元素。

          MySQL中的InnoDB引擎是以主鍵ID為索引的數(shù)據(jù)存儲(chǔ)引擎。InnoDB通過(guò)B+樹(shù)結(jié)構(gòu)對(duì)ID建立索引,在葉子節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)。若建索引的字段不是主鍵ID,則對(duì)該字段建索引,然后再葉子節(jié)點(diǎn)中存儲(chǔ)的是該記錄的主鍵,然后通過(guò)主鍵索引找到對(duì)應(yīng)的記錄。因?yàn)椴辉傩枰頀呙瑁恍枰獙?duì)樹(shù)進(jìn)行搜索即可,所以查找速度很快,還可以用于排序和分組。

          InnoDB和MyISAM引擎都是基于B+樹(shù),InnoDB是聚簇索引,數(shù)據(jù)域存放的是完整的數(shù)據(jù)記錄;MyISAM是非聚簇索引,數(shù)據(jù)域存放的是數(shù)據(jù)記錄的地址。InnoDB支持表鎖、行鎖、間隙鎖、外鍵以及事務(wù),MyISAM僅支持表鎖,同時(shí)不支持外鍵和事務(wù)。InnoDB注重事務(wù),MyISAM注重性能。

          2、SQL語(yǔ)言之DQL、DML、DDL和DCL

          DQL指的是Data Query Language,數(shù)據(jù)庫(kù)查詢語(yǔ)言,主要是select命令;

          DML指的是Data Manipulation Language,數(shù)據(jù)庫(kù)操作語(yǔ)言,主要有insert、delete、update等命令;

          DDL指的是Data Defined Language,數(shù)據(jù)庫(kù)定義語(yǔ)言,主要是對(duì)數(shù)據(jù)庫(kù)的某些對(duì)象,如database和table進(jìn)行管理,主要有create、alter、drop等命令,比如創(chuàng)建數(shù)據(jù)庫(kù)和表格、更改表結(jié)構(gòu)和設(shè)置約束、刪除表和數(shù)據(jù)庫(kù);

          DCL指的是Data Control Language,數(shù)據(jù)庫(kù)控制語(yǔ)言,主要是用于授予或回收訪問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán),并控制數(shù)據(jù)庫(kù)操縱事務(wù)發(fā)生的時(shí)間及效果,主要有g(shù)rant、rollback等命令。

          DML和DDL的區(qū)別:DML操作可以手動(dòng)控制事務(wù)的開(kāi)啟、提交和回滾,而DDL是隱形提交不能回滾。

          3、數(shù)據(jù)庫(kù)連接協(xié)議

          JDBC驅(qū)動(dòng)協(xié)議:默認(rèn)TCP協(xié)議

          客戶端和Oracle服務(wù)器之間通信協(xié)議是TCP的,但是一個(gè)數(shù)據(jù)庫(kù)連接也會(huì)其一個(gè)UDP端口。

          MySQL的連接方式有兩種:Socket和TCP/IP

          --?Socket連接方式
          mysql?-uroot?-padmin?-S/application/mysql/tmp/mysql.sock
          --?TCP/IP連接方式
          mysql?-uoot?-padmin?-h192.1.1.20

          4、索引和主鍵的區(qū)別

          主鍵用于標(biāo)識(shí)數(shù)據(jù)庫(kù)記錄的唯一性,不允許記錄重復(fù)且鍵值不能為空。主鍵是特殊索引,但索引不一定是主鍵。

          索引可以提高查詢速度,可以不需要進(jìn)行全表掃描而快速查詢到結(jié)果。

          使用主鍵,數(shù)據(jù)庫(kù)會(huì)自動(dòng)創(chuàng)建主鍵索引,同時(shí)也可以再非主鍵上創(chuàng)建索引。

          數(shù)據(jù)表中只能由一個(gè)主鍵,但可以有多個(gè)索引。

          5、數(shù)據(jù)庫(kù)四范式

          范式:創(chuàng)建數(shù)據(jù)庫(kù)的過(guò)程中必須遵循的準(zhǔn)則。其作用在于減少數(shù)據(jù)庫(kù)中的數(shù)據(jù)冗余,以增加數(shù)據(jù)的一致性。

          候選鍵:唯一識(shí)別該表的屬性或?qū)傩员怼?/p>

          第一范式(1NF):屬性不可拆分或無(wú)重復(fù)的列;

          第二范式(2NF):數(shù)據(jù)庫(kù)中的每一行必須被唯一地區(qū)分,即表中字段必須完全依賴于全部主鍵而非部分主鍵;

          第三范式(3NF):消除傳遞依賴,數(shù)據(jù)庫(kù)非主鍵外的所有字段僅能以來(lái)于候選鍵,不存在與其他非主鍵關(guān)聯(lián);

          第四范式(4NF):一個(gè)表的主鍵只對(duì)應(yīng)一個(gè)多值,即消除多值依賴。

          6、SQL基礎(chǔ)

          數(shù)據(jù)庫(kù)的創(chuàng)建與使用:

          create?database?test;
          use?test;

          創(chuàng)建表:

          create?table?mytable?(
          id?int?not?null?auto_increment,
          name?varchar(20)
          );

          修改表:

          alter?table?mytable?add?sex?varchar(20);

          增刪改:

          insert?into?mytable(id,name,sex)?values(1,'zhangsan','male');
          delete?from?mytable?where?id?=?1;
          update?mytable?set?name?=?'lisi'?where?id?=?1;

          清空表:

          truncate?table?mytable;

          distinct:用于返回唯一不同的值

          select?distinct?name?from?mytable;

          limit:檢索記錄行

          --?檢索前5個(gè)記錄行
          select?*?from?mytable?limit?5;
          --?檢索記錄行1-5行
          select?*?from?mytable?limit?0,?5;
          --?檢索6-last行
          select?*?from?mytable?limit?5,?-1;

          排序:

          --?默認(rèn)升序
          select?*?from?mytable?order?by?col1?DESC,?col2?ASC;

          like匹配:

          --?%匹配大于等于1個(gè)任意字符
          select?*?from?mytable?where?name?=?'z%';
          --?_匹配1個(gè)任意字符
          select?*?from?mytable?where?name?=?'l_s_';
          --?[]匹配集合內(nèi)的字符
          select?*?from?mytable?where?name?=?'[zl]%';
          --?[!]匹配除開(kāi)集合內(nèi)的字符
          select?*?from?mytable?where?name?=?'[!z]%';

          concat():用于將多個(gè)字符串連接成一個(gè)字符串

          select?concat(trim(col1),?'(',?trim(col2),?')')?as?new?from?mytable;

          函數(shù):

          --?均值
          select?avg(col)?as?col_avg?from?mytable;
          --?計(jì)數(shù)
          select?count(col)?as?col_count?from?mytable;
          --?類似的sum()、max()、min()等
          --?時(shí)間
          select?now();

          分組:

          select?col,?count(*)?as?num?from?mytable?where?col?>?2?group?by?col?having?by?num?>?2;

          子查詢中只能返回一個(gè)字段的數(shù)據(jù):

          select?*?from?mytable1?where?col1?in?(select?col2?from?mytable2);

          組合查詢:

          select?*?from?mytable?where?col?=?1?union?select?col?from?mytable?where?col?=?2;

          視圖:

          create?view?as?myview?as?select?*?from?mytable?where?id?>?2;

          存儲(chǔ)過(guò)程:

          create?procedure?myprocedure(out?ret?int)
          begin
          ...
          end

          7、 刪除操作delete、truncate和drop

          delete:直接刪除表中的某一行數(shù)據(jù),并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存便于進(jìn)行回滾,因此delete操作更加占用資源,數(shù)據(jù)空間不釋放。delete可以對(duì)table和view對(duì)象進(jìn)行操作。

          delete?from?mytable?where?id?=?1;

          truncate:一次性從數(shù)據(jù)表中刪除所有數(shù)據(jù)(釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù)),因此不能回滾,占用資源更加少,速度更快。數(shù)據(jù)空間釋放后,表和索引所占用的空間會(huì)回復(fù)到初始大小。只能對(duì)沒(méi)有關(guān)聯(lián)視圖的table進(jìn)行操作,對(duì)于外鍵約束引用的表,不能使用truncate,需要使用delete。

          truncate mytable;

          drop:刪除整個(gè)表,包括表的結(jié)構(gòu)、數(shù)據(jù)、定義等。屬于永久抹去,空間會(huì)釋放,無(wú)法恢復(fù),對(duì)table和view都能操作。

          drop?mytable;

          總結(jié):

          在速度上,drop > truncate > delete;

          在操作對(duì)象上,delete和drop可以對(duì)table和view操作,truncate只能對(duì)table操作;

          在表和索引所占空間上,delete操作不會(huì)減少表和索引占用的空間,truncate操作后表和索引所占用的空間會(huì)恢復(fù)至初始大小,drop將表所占用的空間全部釋放;

          在回滾上方面,delete操作為DML語(yǔ)句可以回滾,truncate和drop為DDL語(yǔ)句,隱式提交無(wú)法回滾;

          在刪除限制上,delete可以操作帶有外鍵約束引用的表,而truncate不可以;

          8、char和varchar的區(qū)別

          char的長(zhǎng)度是不可變的,而varchar的長(zhǎng)度是可變的。例如,創(chuàng)建表時(shí)定義一個(gè)char[10]和varchar[10],當(dāng)存入一個(gè)字符串sql時(shí),char所占的長(zhǎng)度依然為10,除了字符sql外后面跟7個(gè)空格,而varchar所占的長(zhǎng)度變?yōu)樽址膶?shí)際長(zhǎng)度3。在取數(shù)據(jù)時(shí),char類型的要用trim()函數(shù)去掉多余的空格,而varchar類型不需要。

          char類型的存取速度比varchar快得多,因?yàn)槠溟L(zhǎng)度固定方便存儲(chǔ)與查找;但char類型會(huì)付出空間的代價(jià),是以空間換時(shí)間來(lái)爭(zhēng)取高的時(shí)間效率,而varchar是以空間效率為首。

          char對(duì)英文字符(ASCII)占用1個(gè)字節(jié),對(duì)漢字占用2個(gè)字節(jié);varchar對(duì)英文字符和漢字都是占用2個(gè)字節(jié)。

          9、 數(shù)據(jù)庫(kù)的冷備份與熱備份

          冷備份(off,慢,時(shí)間點(diǎn)上恢復(fù)):需要數(shù)據(jù)庫(kù)正常關(guān)閉,會(huì)提供一個(gè)完整的數(shù)據(jù)庫(kù);將關(guān)鍵性文件拷貝到另外位置;對(duì)于備份數(shù)據(jù)庫(kù)信息而言,冷備份是最快最安全的方法。

          優(yōu)點(diǎn):易歸檔、能夠回復(fù)到某個(gè)時(shí)間點(diǎn);

          缺點(diǎn):數(shù)據(jù)庫(kù)必須處于關(guān)閉狀態(tài);

          熱備份(on,塊):數(shù)據(jù)庫(kù)運(yùn)行的情況下,備份數(shù)據(jù)庫(kù)操作的sql語(yǔ)句,當(dāng)數(shù)據(jù)庫(kù)發(fā)生問(wèn)題時(shí)可以重新執(zhí)行一遍備份的sql語(yǔ)句。

          優(yōu)點(diǎn):備份時(shí)數(shù)據(jù)庫(kù)仍可以使用、快速恢復(fù)、屬于表或數(shù)據(jù)庫(kù)級(jí)別的備份,并且時(shí)間短

          缺點(diǎn):不能出錯(cuò)

          10、數(shù)據(jù)庫(kù)的事務(wù)及ACID屬性

          事務(wù):邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。

          四大特性:

          A原子性:事務(wù)是最小的執(zhí)行單位,不可分割,要么全部執(zhí)行,要么都不執(zhí)行;

          C一致性:事務(wù)執(zhí)行前后,數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致,多個(gè)事務(wù)對(duì)同一數(shù)據(jù)讀取的結(jié)果是相同的;

          I隔離性:并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),事務(wù)之間互不打擾,各并發(fā)事務(wù)之間的數(shù)據(jù)庫(kù)是獨(dú)立的;

          D持久性:一個(gè)事務(wù)被提交之后,該事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的改變是持久的,不會(huì)被回滾。

          11、并發(fā)事務(wù)的問(wèn)題

          臟讀:一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)還未提交的修改數(shù)據(jù),如果另一個(gè)事務(wù)進(jìn)行了回滾,這個(gè)數(shù)據(jù)就是臟數(shù)據(jù)。

          修改丟失:一個(gè)事務(wù)讀取數(shù)據(jù)并進(jìn)行了修改,另一個(gè)事務(wù)頁(yè)讀取了該數(shù)據(jù)進(jìn)行了修改,這樣第一個(gè)事務(wù)的修改結(jié)果就丟失了,也就是修改丟失問(wèn)題。

          不可重復(fù)讀:一個(gè)事務(wù)對(duì)同一數(shù)據(jù)進(jìn)行多次修改,期間另一事務(wù)也讀取了該數(shù)據(jù)并進(jìn)行了修改,這樣第一個(gè)事務(wù)讀取到的數(shù)據(jù)可能不一致,稱為不可重復(fù)讀。

          幻讀:一個(gè)事務(wù)在讀取多行數(shù)據(jù)時(shí),另一個(gè)并發(fā)事務(wù)插入了一些新數(shù)據(jù),后續(xù)查詢中第一個(gè)事務(wù)會(huì)查找到一些原本不存在的數(shù)據(jù)記錄,稱為幻讀。在Mysql中利用MVCC解決了快照讀幻讀,利用間隙鎖解決了當(dāng)前讀幻讀

          12、隔離級(jí)別

          讀未提交:最低隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更,會(huì)導(dǎo)致臟讀、不可重復(fù)讀和幻讀;

          讀已提交:允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,會(huì)導(dǎo)致不可重復(fù)讀和幻讀;

          可重復(fù)讀:對(duì)同一字段多次讀取的結(jié)果都是一樣的,可以阻止臟讀和不可重復(fù)讀,會(huì)導(dǎo)致幻讀;

          串行化:最高隔離界別,可以阻止臟讀、不可重復(fù)讀和幻讀。

          MySQL中InnoDB引擎默認(rèn)支持的隔離級(jí)別是可重復(fù)讀,使用的是next-key Lock算法,可以避免幻讀的產(chǎn)生,可以完全保證事務(wù)的隔離性要求

          13、多表查詢

          一對(duì)多關(guān)系:從表使用主表的主鍵作為外鍵;主表中有的數(shù)據(jù),從表中可以沒(méi)有;主表必須有數(shù)據(jù),才能向從表中添加數(shù)據(jù);要先刪除從表的相應(yīng)數(shù)據(jù)才能刪除主表的數(shù)據(jù);

          多對(duì)多關(guān)系:老師與學(xué)生,一個(gè)老師可以教多個(gè)學(xué)生,一個(gè)學(xué)生也可以從多個(gè)老師那里學(xué)習(xí)知識(shí)。創(chuàng)建表格時(shí),將多對(duì)多的關(guān)系拆分為多個(gè)一對(duì)多關(guān)系。

          14、數(shù)據(jù)庫(kù)表的連接方式

          內(nèi)連接:inner join……on…… :取交集

          外連接:

          • 1)left join……on…… :以左表為準(zhǔn),查詢出左表的所有數(shù)據(jù),右表中有對(duì)應(yīng)的則顯示出來(lái),沒(méi)有對(duì)應(yīng)的則顯示為null;

          • 2)right join……on…… :以右表為準(zhǔn),查詢出右表的所有數(shù)據(jù),左表中有對(duì)應(yīng)的則顯示出來(lái),沒(méi)有對(duì)應(yīng)的則顯示為null;

          • 3)full join……on…… :left和right的集合,某表中某一行在另一表中無(wú)匹配行,則相應(yīng)列的內(nèi)容為null;

          交叉連接:cross join…… :笛卡爾積,相當(dāng)于兩個(gè)表中的所有行進(jìn)行排列組合。

          15、存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)

          存儲(chǔ)過(guò)程:為以后的使用而保存的一條或多條SQL語(yǔ)句的集合,相當(dāng)于批處理。存儲(chǔ)過(guò)程被編譯后會(huì)被直接保存在數(shù)據(jù)庫(kù)中,成為數(shù)據(jù)庫(kù)的一部分,以后就可以反復(fù)調(diào)用、運(yùn)行速度快。

          --?in表示輸入變量,out表示輸出變量,inout輸入輸出均可
          create?procedure?myprocedure([IN|OUT|INOUT]?參數(shù)名?數(shù)據(jù)類型,?[IN|OUT|INOUT]?參數(shù)名?數(shù)據(jù)類型,?...)
          begin
          ...
          end

          存儲(chǔ)函數(shù):

          create?function?myfunction(參數(shù)名?數(shù)據(jù)類型,?...)?returns?返回類型
          begin
          ...
          end

          二者區(qū)別:

          • 存儲(chǔ)函數(shù)限制較多,例如不能使用臨時(shí)表,只能用表變量,而存儲(chǔ)過(guò)程限制較少;

          • 存儲(chǔ)過(guò)程可以實(shí)現(xiàn)復(fù)雜的功能,存儲(chǔ)函數(shù)針對(duì)性比較強(qiáng);

          • 返回值不同,存儲(chǔ)過(guò)程可以沒(méi)有返回值,也可以返回單個(gè)或多個(gè)結(jié)果集,而存儲(chǔ)函數(shù)有且僅有一個(gè)返回值;

          • 調(diào)用不同。存儲(chǔ)過(guò)程通過(guò)call語(yǔ)句調(diào)用,存儲(chǔ)函數(shù)通過(guò)select調(diào)用;

          • 參數(shù)不同。存儲(chǔ)過(guò)程的參數(shù)類型可以是in、out、inout,而存儲(chǔ)函數(shù)的參數(shù)類型只有in類型。

          16、觸發(fā)器

          SQL觸發(fā)器是一種特殊類型的存儲(chǔ)過(guò)程,不由用戶調(diào)用。它在指定的表中的數(shù)據(jù)發(fā)生變化時(shí)自動(dòng)生效。喚醒調(diào)用觸發(fā)器以響應(yīng)Insert、Update和Delete語(yǔ)句。他可以查詢其它表,并可以包含復(fù)雜的Transact-SQL語(yǔ)句。將觸發(fā)器和觸發(fā)它的語(yǔ)句作為可在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對(duì)待。如果檢測(cè)到嚴(yán)重錯(cuò)誤,整個(gè)事務(wù)自動(dòng)回滾。

          優(yōu)點(diǎn):

          • 觸發(fā)器可通過(guò)數(shù)據(jù)庫(kù)中的相關(guān)表實(shí)現(xiàn)級(jí)聯(lián)更改;

          • 觸發(fā)器可以強(qiáng)制比用check約束定義的約束更為復(fù)雜的約束;

          • 在約束所支持的功能無(wú)法滿足應(yīng)用程序的功能要求時(shí),觸發(fā)器就極為有用。

          create?trigger?trigger_order?after?insert?on?orders?for?each?row
          begin
          update?product?set?pnum?=?pnum?-?new.onum?where?pid?=?new.pid;
          end

          17、數(shù)據(jù)庫(kù)的鎖機(jī)制

          MyISAM和InnoDB存儲(chǔ)引擎使用的鎖:

          MyISAM采用表級(jí)鎖(table-level locking),InnoDB支持行級(jí)鎖(row-level locking)和表級(jí)鎖,默認(rèn)為行級(jí)鎖。

          二者對(duì)比:

          • 表級(jí)鎖:MySQL中粒度最大的鎖,對(duì)當(dāng)前操作的整張表加鎖,實(shí)現(xiàn)簡(jiǎn)單,資源消耗少,加鎖快,不會(huì)出現(xiàn)死鎖。鎖沖突的概率高,并發(fā)度低。

          • 行級(jí)鎖:MySQL中粒度最小的鎖,只針對(duì)當(dāng)前操作的行進(jìn)行加鎖。行級(jí)鎖能大大減少數(shù)據(jù)庫(kù)操作的沖突。加鎖慢,開(kāi)銷大,并發(fā)度高,會(huì)出現(xiàn)死鎖。

          InnoDB引擎的鎖算法:

          • Record lock:記錄鎖。條件為精準(zhǔn)匹配時(shí),鎖住具體的索引項(xiàng);

          • Gap lock:間隙鎖。鎖定一個(gè)范圍,不包括記錄本身。

          • Next-key lock:臨鍵鎖。鎖定一個(gè)范圍,包含記錄本身。

          按思想分為樂(lè)觀鎖和悲觀鎖

          • 樂(lè)觀鎖:事務(wù)并發(fā)操作時(shí)認(rèn)為不會(huì)發(fā)生沖突,對(duì)數(shù)據(jù)進(jìn)行更新并提交,如果檢測(cè)到?jīng)_突就返回。

          • 悲觀鎖:事務(wù)并發(fā)操作使認(rèn)為會(huì)發(fā)生沖突,先進(jìn)行加鎖操作。

          18、日志

          bin log:二進(jìn)制日志(服務(wù)層):涉及到主從復(fù)制;

          redo log:重做日志(引擎層):數(shù)據(jù)的災(zāi)后重新提交,物理日志。包括兩部分,內(nèi)存中的日志緩存(redo log buffer)(易失性)和磁盤(pán)上的重做日志(redo log file)(持久性),需要將redo log buffer通過(guò)操作系統(tǒng)內(nèi)核空間的OS buffer刷到磁盤(pán)上的log file中。

          undo log:回滾日志(引擎層):主要用于數(shù)據(jù)修改的回滾,邏輯日志。會(huì)給予與操作相反的語(yǔ)句,當(dāng)事務(wù)回滾時(shí)從undo log中反向讀取內(nèi)容。

          MVCC:Multiversion concurrency control,多版本并發(fā)控制,實(shí)現(xiàn)并發(fā)和回滾的重要功能。它指的是數(shù)據(jù)庫(kù)中的每一條數(shù)據(jù),會(huì)存在多個(gè)版本。對(duì)同一條數(shù)據(jù)而言,MySQL 會(huì)通過(guò)一定的手段(ReadView 機(jī)制)控制每一個(gè)事務(wù)看到不同版本的數(shù)據(jù),這樣也就解決了不可重復(fù)讀的問(wèn)題。

          19、解決幻讀

          Innodb引擎中,每條聚集索引都會(huì)有兩個(gè)隱藏字段:trx_idroll_pointer,每次事務(wù)對(duì)一條記錄進(jìn)行改動(dòng)時(shí),就會(huì)將事務(wù)id賦值給trx_id,并且會(huì)將舊數(shù)據(jù)寫(xiě)入一條undo日志,每條undo日志都有roll_pointer屬性,可以將這些undo日志都連起來(lái),串成一個(gè)鏈表,undo日志的寫(xiě)入采用頭插法,新數(shù)據(jù)在前。

          • 快照讀:?MVCC中有一個(gè)ReadView的概念,其中記錄了生成ReadView時(shí)的活躍事務(wù)id列表:m_ids最小事務(wù)id:min_trx_id將要分配給下一個(gè)事務(wù)的id:max_trx_id生成ReadView的事務(wù)id:creator_trx_id。如果被訪問(wèn)版本的trx_idcreator_trx_id相同或者小于min_trx_id,則可以訪問(wèn);如果被訪問(wèn)版本的trx_id大于等于max_trx_id,則不能訪問(wèn);如果被訪問(wèn)版本的trx_idmin_trx_idmax_trx_id之間,則當(dāng)trx_id不在m_ids中時(shí)才能訪問(wèn)。

          • 當(dāng)前讀:?InnoDB存儲(chǔ)引擎有三種鎖:Record lock:?jiǎn)蝹€(gè)行記錄上的鎖;Gap lock:間隙鎖,鎖定一個(gè)范圍,不包括記錄本身;Next-key lockrecord+gap?鎖定一個(gè)范圍,包含記錄本身。innodb對(duì)于行的查詢使用next-key lock,當(dāng)查詢的索引含有唯一屬性時(shí),將next-key lock降級(jí)為record key

          20、數(shù)據(jù)庫(kù)的索引機(jī)制

          需要?jiǎng)?chuàng)建索引的情況:

          • 主鍵自動(dòng)建立唯一索引;

          • 頻繁作為查詢條件的字段;

          • 查詢與其它表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引;

          • 查詢中排序的字段(通過(guò)索引訪問(wèn)將大大提高排序速度);

          • 查詢中統(tǒng)計(jì)或分組的字段。

          不需要?jiǎng)?chuàng)建索引的情況:

          • 表記錄太少;

          • 經(jīng)常增刪改的表;

          • 頻繁更新的字段;

          • where條件里用不到的字段;

          • 數(shù)據(jù)重復(fù)且分布平均的字段

          21、explain關(guān)鍵字

          id:選擇標(biāo)識(shí)符;select_type:查詢的類型;table:輸出結(jié)果集的表;type:表的連接類型;possible_keys:可能使用的索引;key:實(shí)際使用的索引;key_len:索引字段的長(zhǎng)度;ref:列與索引的比較;rows:掃描出的行數(shù);extra:執(zhí)行情況的描述和說(shuō)明。

          22、索引優(yōu)化思路

          開(kāi)啟慢查詢?nèi)罩驹O(shè)置閾值;explain做慢SQL分析。

          查詢截取分析:using filesort效率低,using index效率高;最左前綴原則

          23、索引創(chuàng)建規(guī)則

          最左前綴匹配原則:mysql會(huì)一直向右匹配指導(dǎo)遇到范圍查詢(betwee、like)就停止查詢;選擇區(qū)分度高的列作為索引;選擇唯一性索引;盡量使用數(shù)據(jù)量少的索引;盡量使用前綴來(lái)索引;索引列不能參與計(jì)算;盡量的擴(kuò)展索引不要新建索引;限制索引的數(shù)目。

          24、索引過(guò)多的問(wèn)題

          一般一個(gè)表對(duì)應(yīng)5個(gè)索引左右,索引過(guò)多會(huì)導(dǎo)致:查找數(shù)據(jù)變慢;對(duì)insert語(yǔ)句影響很大,尤其是無(wú)序插入;刪除數(shù)據(jù)多的情況下索引也需要更新;索引文件過(guò)大,占用存儲(chǔ)空間,尋址的查詢時(shí)間長(zhǎng);mysql優(yōu)化器需要評(píng)估更多的組合。






          粉絲福利:108本java從入門(mén)到大神精選電子書(shū)領(lǐng)取

          ???

          ?長(zhǎng)按上方鋒哥微信二維碼?2 秒
          備注「1234」即可獲取資料以及
          可以進(jìn)入java1234官方微信群



          感謝點(diǎn)贊支持下哈?

          瀏覽 54
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  999操逼视频 | 网址成人视频国产偷拍 | 人成网站在线观看 | 手机看欧美A片 | 激情综合五月丁香 |