日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

數(shù)據(jù)結(jié)構(gòu)以及算法

索引的本質(zhì)其實(shí)就是一種數(shù)據(jù)結(jié)構(gòu)。我們都希望查詢數(shù)據(jù)的速度能盡可能的快,因此數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì)者會(huì)從查詢算法的角度進(jìn)行優(yōu)化。最基本的查詢算法當(dāng)然是順序查找,這種復(fù)雜度為 O(n) 的算法在數(shù)據(jù)量很大時(shí)顯然是糟糕的,好在計(jì)算機(jī)科學(xué)的發(fā)展提供了很多更優(yōu)秀的查找算法,例如二分查找、二叉樹查找等。如果稍微分析一下會(huì)發(fā)現(xiàn),每種查找算法都只能應(yīng)用于特定的數(shù)據(jù)結(jié)構(gòu)之上,例如二分查找要求被檢索數(shù)據(jù)有序,而二叉樹查找只能應(yīng)用于二叉查找樹上,但是數(shù)據(jù)本身的組織結(jié)構(gòu)不可能完全滿足各種數(shù)據(jù)結(jié)構(gòu)(例如,理論上不可能同時(shí)將兩列都按順序進(jìn)行組織),所以,在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實(shí)現(xiàn)高級(jí)查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。

我們一起聊聊MySQL 索引的底層邏輯圖片

1.1 B-Tree

為了描述 B-Tree ,首先定義一條數(shù)據(jù)記錄為一個(gè)二元組 [key, data] , key 為記錄的鍵值,對(duì)于不同數(shù)據(jù)記錄, key 是互不相同的;data 為數(shù)據(jù)記錄除 key 外的數(shù)據(jù)。那么 B-Tree 是滿足下列條件的數(shù)據(jù)結(jié)構(gòu):

  1. d 為大于 1 的一個(gè)正整數(shù),稱為 B-Tree 的度。
  2. h 為一個(gè)正整數(shù),稱為 B-Tree 的高度。
  3. 每個(gè)非葉子節(jié)點(diǎn)由 n-1 個(gè) key 和 n 個(gè)指針組成,其中 d<=n<=2d 。
  4. 每個(gè)葉子節(jié)點(diǎn)最少包含一個(gè) key 和兩個(gè)指針,最多包含 2d-1 個(gè) key 和 2d 個(gè)指針,葉節(jié)點(diǎn)的指針均為 null 。
  5. 所有葉節(jié)點(diǎn)具有相同的深度,等于樹高 h 。
  6. key 和指針互相間隔,節(jié)點(diǎn)兩端是指針。
  7. 一個(gè)節(jié)點(diǎn)中的 key 從左到右非遞減排列。
  8. 所有節(jié)點(diǎn)組成樹結(jié)構(gòu)。
  9. 每個(gè)指針要么為 null ,要么指向另外一個(gè)節(jié)點(diǎn)。
  10. 如果某個(gè)指針在節(jié)點(diǎn) node 最左邊且不為 null ,則其指向節(jié)點(diǎn)的所有 key 小于 v(key_1),其中 v(key_1) 為 node 的第一個(gè) key 的值。
  11. 如果某個(gè)指針在節(jié)點(diǎn) node 最右邊且不為 null ,則其指向節(jié)點(diǎn)的所有 key 大于 v(key_m) ,其中 v(key_m) 為 node 的最后一個(gè) key 的值。
  12. 如果某個(gè)指針在節(jié)點(diǎn) node 的左右相鄰 key 分別是 key_i 和 key{i+1} 且不為 null ,則其指向節(jié)點(diǎn)的所有 key 小于 v(key{i+1}) 且大于 v(key_i) 。

如下是一個(gè) d = 2 的 B-Tree 示意圖。

我們一起聊聊MySQL 索引的底層邏輯圖片

由于 B-Tree 的特性,在 B-Tree 中按 key 檢索數(shù)據(jù)的算法非常直觀:首先從根節(jié)點(diǎn)進(jìn)行二分查找,如果找到則返回對(duì)應(yīng)節(jié)點(diǎn)的 data ,否則對(duì)相應(yīng)區(qū)間的指針指向的節(jié)點(diǎn)遞歸進(jìn)行查找,直到找到節(jié)點(diǎn)或找到 null 指針,前者查找成功,后者查找失敗。B-Tree 上查找算法的偽代碼如下:

BTree_Search(node, key) {
    if(node == null) return null;
    foreach(node.key)
    {
        if(node.key[i] == key) return node.data[i];
        if(node.key[i] > key) return BTree_Search(point[i]->node);
    }
    return BTree_Search(point[i+1]->node);
}
data = BTree_Search(root, my_key);

關(guān)于 B-Tree 有一系列有趣的性質(zhì),例如一個(gè)度為 d 的 B-Tree ,設(shè)其索引 N 個(gè) key ,則其樹高 h 的上限為 log_d((N+1)/2) ,檢索一個(gè) key ,其查找節(jié)點(diǎn)個(gè)數(shù)的漸進(jìn)復(fù)雜度為 O(log_dN) 。從這點(diǎn)可以看出, B-Tree 是一個(gè)非常有效率的索引數(shù)據(jù)結(jié)構(gòu)。

1.2 B+Tree

B-Tree 有許多變種,其中最常見的是 B+Tree ,例如 MySQL 就普遍使用 B+Tree 實(shí)現(xiàn)其索引結(jié)構(gòu)。與 B-Tree 相比, B+Tree 有以下不同點(diǎn):

  1. 每個(gè)節(jié)點(diǎn)的指針上限為 2d 而不是 2d+1 。
  2. 內(nèi)節(jié)點(diǎn)不存儲(chǔ) data ,只存儲(chǔ) key ;葉子節(jié)點(diǎn)不存儲(chǔ)指針。

如下是一個(gè)簡(jiǎn)單的 B+Tree 示意。

我們一起聊聊MySQL 索引的底層邏輯圖片

由于并不是所有節(jié)點(diǎn)都具有相同的域,因此 B+Tree 中葉節(jié)點(diǎn)和內(nèi)節(jié)點(diǎn)一般大小不同。這點(diǎn)與 B-Tree 不同,雖然 B-Tree 中不同節(jié)點(diǎn)存放的 key 和指針可能數(shù)量不一致,但是每個(gè)節(jié)點(diǎn)的域和上限是一致的,所以在實(shí)現(xiàn)中 B-Tree 往往對(duì)每個(gè)節(jié)點(diǎn)申請(qǐng)同等大小的空間。一般來說, B+Tree 比 B-Tree 更適合實(shí)現(xiàn)外存儲(chǔ)索引結(jié)構(gòu),具體原因與外存儲(chǔ)器原理及計(jì)算機(jī)存取原理有關(guān),將在下面討論。

1.3 帶有順序訪問指針的 B+Tree

一般在數(shù)據(jù)庫系統(tǒng)或文件系統(tǒng)中使用的 B+Tree 結(jié)構(gòu)都在經(jīng)典 B+Tree 的基礎(chǔ)上進(jìn)行了優(yōu)化,增加了順序訪問指針。

我們一起聊聊MySQL 索引的底層邏輯圖片

如圖所示,在 B+Tree 的每個(gè)葉子節(jié)點(diǎn)增加一個(gè)指向相鄰葉子節(jié)點(diǎn)的指針,就形成了帶有順序訪問指針的 B+Tree 。做這個(gè)優(yōu)化的目的是為了提高區(qū)間訪問的性能,例如圖中如果要查詢 key 為從 18 到 49 的所有數(shù)據(jù)記錄,當(dāng)找到 18 后,只需順著節(jié)點(diǎn)和指針順序遍歷就可以一次性訪問到所有數(shù)據(jù)節(jié)點(diǎn),極大提到了區(qū)間查詢效率。

1.4 為什么使用 B-Tree / B+Tree

紅黑樹等數(shù)據(jù)結(jié)構(gòu)也可以用來實(shí)現(xiàn)索引,但是文件系統(tǒng)及數(shù)據(jù)庫系統(tǒng)普遍采用 B-/+Tree 作為索引結(jié)構(gòu),這一節(jié)將結(jié)合計(jì)算機(jī)組成原理相關(guān)知識(shí)討論 B-/+Tree 作為索引的理論基礎(chǔ)。一般來說,索引本身也很大,不可能全部存儲(chǔ)在內(nèi)存中,因此索引往往以索引文件的形式存儲(chǔ)的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤 I/O 消耗,相對(duì)于內(nèi)存存取, I/O 存取的消耗要高幾個(gè)數(shù)量級(jí),所以評(píng)價(jià)一個(gè)數(shù)據(jù)結(jié)構(gòu)作為索引的優(yōu)劣最重要的指標(biāo)就是在查找過程中磁盤 I/O 操作次數(shù)的漸進(jìn)復(fù)雜度。換句話說,索引的結(jié)構(gòu)組織要盡量減少查找過程中磁盤 I/O 的存取次數(shù)。下面先介紹內(nèi)存和磁盤存取原理,然后再結(jié)合這些原理分析 B-/+Tree 作為索引的效率。

主存存取原理

目前計(jì)算機(jī)使用的主存基本都是隨機(jī)讀寫存儲(chǔ)器 ( RAM ) ,現(xiàn)代 RAM 的結(jié)構(gòu)和存取原理比較復(fù)雜,這里本文拋卻具體差別,抽象出一個(gè)十分簡(jiǎn)單的存取模型來說明 RAM 的工作原理。

我們一起聊聊MySQL 索引的底層邏輯圖片

從抽象角度看,主存是一系列的存儲(chǔ)單元組成的矩陣,每個(gè)存儲(chǔ)單元存儲(chǔ)固定大小的數(shù)據(jù)。每個(gè)存儲(chǔ)單元有唯一的地址,現(xiàn)代主存的編址規(guī)則比較復(fù)雜,這里將其簡(jiǎn)化成一個(gè)二維地址:通過一個(gè)行地址和一個(gè)列地址可以唯一定位到一個(gè)存儲(chǔ)單元。上圖展示了一個(gè) 4 x 4 的主存模型。主存的存取過程如下:當(dāng)系統(tǒng)需要讀取主存時(shí),則將地址信號(hào)放到地址總線上傳給主存,主存讀到地址信號(hào)后,解析信號(hào)并定位到指定存儲(chǔ)單元,然后將此存儲(chǔ)單元數(shù)據(jù)放到數(shù)據(jù)總線上,供其它部件讀取。寫主存的過程類似,系統(tǒng)將要寫入單元地址和數(shù)據(jù)分別放在地址總線和數(shù)據(jù)總線上,主存讀取兩個(gè)總線的內(nèi)容,做相應(yīng)的寫操作。這里可以看出,主存存取的時(shí)間僅與存取次數(shù)呈線性關(guān)系,因?yàn)椴淮嬖跈C(jī)械操作,兩次存取的數(shù)據(jù)的“距離”不會(huì)對(duì)時(shí)間有任何影響,例如,先取 A0 再取 A1 和先取 A0 再取 D3 的時(shí)間消耗是一樣的。

磁盤存取原理

上文說過,索引一般以文件形式存儲(chǔ)在磁盤上,索引檢索需要磁盤 I/O 操作。與主存不同,磁盤 I/O 存在機(jī)械運(yùn)動(dòng)耗費(fèi),因此磁盤 I/O 的時(shí)間消耗是巨大的。下圖是磁盤的整體結(jié)構(gòu)示意圖。

我們一起聊聊MySQL 索引的底層邏輯圖片

一個(gè)磁盤由大小相同且同軸的圓形盤片組成,磁盤可以轉(zhuǎn)動(dòng)(各個(gè)磁盤必須同步轉(zhuǎn)動(dòng))。在磁盤的一側(cè)有磁頭支架,磁頭支架固定了一組磁頭,每個(gè)磁頭負(fù)責(zé)存取一個(gè)磁盤的內(nèi)容。磁頭不能轉(zhuǎn)動(dòng),但是可以沿磁盤半徑方向運(yùn)動(dòng)(實(shí)際是斜切向運(yùn)動(dòng)),每個(gè)磁頭同一時(shí)刻也必須是同軸的,即從正上方向下看,所有磁頭任何時(shí)候都是重疊的(不過目前已經(jīng)有多磁頭獨(dú)立技術(shù),可不受此限制)。下圖是磁盤結(jié)構(gòu)的示意圖。

我們一起聊聊MySQL 索引的底層邏輯圖片

盤片被劃分成一系列同心環(huán),圓心是盤片中心,每個(gè)同心環(huán)叫做一個(gè)磁道,所有半徑相同的磁道組成一個(gè)柱面。磁道被沿半徑線劃分成一個(gè)個(gè)小的段,每個(gè)段叫做一個(gè)扇區(qū),每個(gè)扇區(qū)是磁盤的最小存儲(chǔ)單元。為了簡(jiǎn)單起見,我們下面假設(shè)磁盤只有一個(gè)盤片和一個(gè)磁頭。當(dāng)需要從磁盤讀取數(shù)據(jù)時(shí),系統(tǒng)會(huì)將數(shù)據(jù)邏輯地址傳給磁盤,磁盤的控制電路按照尋址邏輯將邏輯地址翻譯成物理地址,即確定要讀的數(shù)據(jù)在哪個(gè)磁道,哪個(gè)扇區(qū)。為了讀取這個(gè)扇區(qū)的數(shù)據(jù),需要將磁頭放到這個(gè)扇區(qū)上方,為了實(shí)現(xiàn)這一點(diǎn),磁頭需要移動(dòng)對(duì)準(zhǔn)相應(yīng)磁道,這個(gè)過程叫做尋道,所耗費(fèi)時(shí)間叫做尋道時(shí)間,然后磁盤旋轉(zhuǎn)將目標(biāo)扇區(qū)旋轉(zhuǎn)到磁頭下,這個(gè)過程耗費(fèi)的時(shí)間叫做旋轉(zhuǎn)時(shí)間。

局部性原理與磁盤預(yù)讀

由于存儲(chǔ)介質(zhì)的特性,磁盤本身存取就比主存慢很多,再加上機(jī)械運(yùn)動(dòng)耗費(fèi),磁盤的存取速度往往是主存的幾百分分之一,因此為了提高效率,要盡量減少磁盤 I/O 。為了達(dá)到這個(gè)目的,磁盤往往不是嚴(yán)格按需讀取,而是每次都會(huì)預(yù)讀,即使只需要一個(gè)字節(jié),磁盤也會(huì)從這個(gè)位置開始,順序向后讀取一定長(zhǎng)度的數(shù)據(jù)放入內(nèi)存。這樣做的理論依據(jù)是計(jì)算機(jī)科學(xué)中著名的局部性原理:當(dāng)一個(gè)數(shù)據(jù)被用到時(shí),其附近的數(shù)據(jù)也通常會(huì)馬上被使用。程序運(yùn)行期間所需要的數(shù)據(jù)通常比較集中。由于磁盤順序讀取的效率很高(不需要尋道時(shí)間,只需很少的旋轉(zhuǎn)時(shí)間),因此對(duì)于具有局部性的程序來說,預(yù)讀可以提高 I/O 效率。預(yù)讀的長(zhǎng)度一般為頁 ( page ) 的整倍數(shù)。頁是計(jì)算機(jī)管理存儲(chǔ)器的邏輯塊,硬件及操作系統(tǒng)往往將主存和磁盤存儲(chǔ)區(qū)分割為連續(xù)的大小相等的塊,每個(gè)存儲(chǔ)塊稱為一頁 (在許多操作系統(tǒng)中,頁得大小通常為 4k ) ,主存和磁盤以頁為單位交換數(shù)據(jù)。當(dāng)程序要讀取的數(shù)據(jù)不在主存中時(shí),會(huì)觸發(fā)一個(gè)缺頁異常,此時(shí)系統(tǒng)會(huì)向磁盤發(fā)出讀盤信號(hào),磁盤會(huì)找到數(shù)據(jù)的起始位置并向后連續(xù)讀取一頁或幾頁載入內(nèi)存中,然后異常返回,程序繼續(xù)運(yùn)行。

B-/+Tree 索引的性能分析

到這里終于可以分析 B-/+Tree 索引的性能了。上面說過一般使用磁盤 I/O 次數(shù)評(píng)價(jià)索引結(jié)構(gòu)的優(yōu)劣。先從 B-Tree 分析,根據(jù) B-Tree 的定義,可知檢索一次最多需要訪問 h 個(gè)節(jié)點(diǎn)。數(shù)據(jù)庫系統(tǒng)的設(shè)計(jì)者巧妙利用了磁盤預(yù)讀原理,將一個(gè)節(jié)點(diǎn)的大小設(shè)為等于一個(gè)頁,這樣每個(gè)節(jié)點(diǎn)只需要一次 I/O 就可以完全載入。為了達(dá)到這個(gè)目的,在實(shí)際實(shí)現(xiàn) B-Tree 還需要使用如下技巧:每次新建節(jié)點(diǎn)時(shí),直接申請(qǐng)一個(gè)頁的空間,這樣就保證一個(gè)節(jié)點(diǎn)物理上也存儲(chǔ)在一個(gè)頁里,加之計(jì)算機(jī)存儲(chǔ)分配都是按頁對(duì)齊的,就實(shí)現(xiàn)了一個(gè) node 只需一次 I/O 。B-Tree 中一次檢索最多需要 h-1 次 I/O(根節(jié)點(diǎn)常駐內(nèi)存),漸進(jìn)復(fù)雜度為 O(h) = O(log_dN) 。一般實(shí)際應(yīng)用中,出度d是非常大的數(shù)字,通常超過 100 ,因此 h 非常小(通常不超過 3 )。綜上所述,用 B-Tree 作為索引結(jié)構(gòu)效率是非常高的。而紅黑樹這種結(jié)構(gòu), h 明顯要深的多。由于邏輯上很近的節(jié)點(diǎn)(父子)物理上可能很遠(yuǎn),無法利用局部性,所以紅黑樹的I/O漸進(jìn)復(fù)雜度也為 O(h) ,效率明顯比 B-Tree 差很多。上面還說過, B+Tree 更適合外存索引,原因和內(nèi)節(jié)點(diǎn)出度 d 有關(guān)。從上面分析可以看到, d 越大索引的性能越好,而出度的上限取決于節(jié)點(diǎn)內(nèi) key 和 data 的大小:d_{max} = floor(pagesize / (keysize + datasize + pointsize)) 。floor 表示向下取整。由于 B+Tree 內(nèi)節(jié)點(diǎn)去掉了 data 域,因此可以擁有更大的出度,擁有更好的性能。

MySQL 的實(shí)現(xiàn)

在 MySQL 中,索引屬于存儲(chǔ)引擎級(jí)別的概念,不同存儲(chǔ)引擎對(duì)索引的實(shí)現(xiàn)方式是不同的,本文主要討論 MyISAM 和 InnoDB 兩個(gè)存儲(chǔ)引擎的索引實(shí)現(xiàn)方式。

2.1 MyISAM 索引實(shí)現(xiàn)

MyISAM 引擎使用 B+Tree 作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的 data 域存放的是數(shù)據(jù)記錄的地址。下圖是 MyISAM 索引的原理圖:

我們一起聊聊MySQL 索引的底層邏輯圖片

這里設(shè)表一共有三列,假設(shè)我們以 Col1 為主鍵,則上圖是一個(gè) MyISAM 表的主索引 ( Primary key ) 示意。可以看出 MyISAM 的索引文件僅僅保存數(shù)據(jù)記錄的地址。在 MyISAM 中,主索引和輔助索引 ( Secondary key ) 在結(jié)構(gòu)上沒有任何區(qū)別,只是主索引要求 key 是唯一的,而輔助索引的 key 可以重復(fù)。如果我們?cè)?Col2 上建立一個(gè)輔助索引,則此索引的結(jié)構(gòu)如下圖所示:

我們一起聊聊MySQL 索引的底層邏輯圖片

同樣也是一顆 B+Tree , data 域保存數(shù)據(jù)記錄的地址。因此, MyISAM 中索引檢索的算法為首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其data域的值,然后以 data 域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。MyISAM 的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與 InnoDB 的聚集索引區(qū)分。

2.2 InnoDB 索引實(shí)現(xiàn)

雖然 InnoDB 也使用 B+Tree 作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與 MyISAM 截然不同。第一個(gè)重大區(qū)別是 InnoDB 的數(shù)據(jù)文件本身就是索引文件。從上文知道, MyISAM 索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在 InnoDB 中,表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個(gè)索引結(jié)構(gòu),這棵樹的葉節(jié)點(diǎn) data 域保存了完整的數(shù)據(jù)記錄。這個(gè)索引的 key 是數(shù)據(jù)表的主鍵,因此 InnoDB 表數(shù)據(jù)文件本身就是主索引。

我們一起聊聊MySQL 索引的底層邏輯圖片

上圖是 InnoDB 主索引(同時(shí)也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因?yàn)?InnoDB 的數(shù)據(jù)文件本身要按主鍵聚集,所以 InnoDB 要求表必須有主鍵( MyISAM 可以沒有),如果沒有顯式指定,則 MySQL 系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則 MySQL 自動(dòng)為 InnoDB 表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為 6 個(gè)字節(jié),類型為長(zhǎng)整形。第二個(gè)與 MyISAM 索引的不同是 InnoDB 的輔助索引 data 域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址。換句話說, InnoDB 的所有輔助索引都引用主鍵作為 data 域。例如,下圖為定義在 Col3 上的一個(gè)輔助索引:

我們一起聊聊MySQL 索引的底層邏輯圖片

這里以英文字符的 ASCII 碼作為比較準(zhǔn)則。聚集索引這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。了解不同存儲(chǔ)引擎的索引實(shí)現(xiàn)方式對(duì)于正確使用和優(yōu)化索引都非常有幫助,例如知道了 InnoDB 的索引實(shí)現(xiàn)后,就很容易明白為什么不建議使用過長(zhǎng)的字段作為主鍵,因?yàn)樗休o助索引都引用主索引,過長(zhǎng)的主索引會(huì)令輔助索引變得過大。再例如,用非單調(diào)的字段作為主鍵在 InnoDB 中不是個(gè)好主意,因?yàn)?InnoDB 數(shù)據(jù)文件本身是一顆 B+Tree ,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持 B+Tree 的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個(gè)很好的選擇。

總結(jié)

本文以 MySQL 數(shù)據(jù)庫為研究對(duì)象,討論與數(shù)據(jù)庫索引相關(guān)的一些話題。特別需要說明的是, MySQL 支持諸多存儲(chǔ)引擎,而各種存儲(chǔ)引擎對(duì)索引的支持也各不相同,因此 MySQL 數(shù)據(jù)庫支持多種索引類型,如 B-Tree 索引,哈希索引,全文索引等等。為了避免混亂,將只關(guān)注于 B-Tree 索引,因?yàn)檫@是平常使用 MySQL 時(shí)主要打交道的索引。

參考文獻(xiàn)

[1] Baron Scbwartz 等 著,王小東等 譯;高性能 MySQL(High Performance MySQL);電子工業(yè)出版社,2010 [2] Michael Kofler 著,楊曉云等 譯;MySQL5權(quán)威指南(The Definitive Guide to MySQL5);人民郵電出版社,2006 [3] 姜承堯 著;MySQL 技術(shù)內(nèi)幕-InnoDB 存儲(chǔ)引擎;機(jī)械工業(yè)出版社,2011

分享到:
標(biāo)簽:索引 MySQL
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定