索引是什么
咬文嚼字不一定是壞事攀隔,再了解MySQL索引前,我們不妨看看詞典中是如何定義索引這個詞語的:
根據(jù)一定需要,把書刊中的主要內(nèi)容或各種題名摘錄下來,標(biāo)明出處昆汹、頁碼,按一定次序分條排列,以供人查閱的資料。
這里有幾個關(guān)鍵點:
- 索引的內(nèi)容是
主要內(nèi)容或題名
- 索引的具體手段是
標(biāo)明頁碼遮精,按順序排列
, - 索引的最終目的是
供人查閱
聯(lián)系到我們實際生活本冲,就是無人不知的新華字典的拼音索引:
最終目的:幫助我們快速定位到一個字的在字典中的具體位置檬洞!
MySQL中索引
和字典的索引差不多,幫助我們快速定位記錄所在位置添怔,但低層的實現(xiàn)和存儲結(jié)構(gòu)不一樣。
通常說的MySQL索引就是B-Tree索引砾脑,因為它是用B-Tree這種數(shù)據(jù)結(jié)構(gòu)來存儲數(shù)據(jù)的艾杏。
那么到底什么是B-Tree呢?
備注:讀B樹购桑,而不是B減樹,國內(nèi)早期翻譯引起的誤會硕噩。但是有B+Tree讀B加樹。
我們來看看它一顆二叉樹如何進化成B-Tree炉擅。
二叉樹:根沒有父節(jié)點匀归,最多有兩個子節(jié)點耗帕;葉子節(jié)點沒有子節(jié)點;其他節(jié)點最多有一個父節(jié)點体啰,兩個子節(jié)點嗽仪。
二叉查找樹:左子樹的key值都小于根的key值,右子樹的key值都大于根的key值闻坚。造成的結(jié)果就是存放的數(shù)據(jù)是有序的,通過中序遍歷(左根右)出來就是從小到大的一組數(shù)據(jù)仅偎。
為什么用查找樹:它是特殊的一種二叉樹。根據(jù)它得存儲特性橘沥,用二分查找法查找數(shù)據(jù)比線性查找要快很多。
二叉平衡樹(AVL樹):左右子樹的高度差不能超過1痢艺。超過1就旋轉(zhuǎn)介陶,直到平衡。如何旋轉(zhuǎn)一時半會說不清斤蔓,暫時拋開不管∮淹裕總之最終得維持樹高度的平衡驾锰。
為什么要旋轉(zhuǎn):因為二叉樹有N種,和key值先后順序有關(guān)椭豫。比如下面的兩棵樹都是二叉查找樹,但是右邊是最極端的情況喳整,變成了線性結(jié)構(gòu)裸扶,但它也滿足二叉查找樹的定義,但和左邊的樹比起來查找效率是很低的:
B-樹:為了快速理解呵晨,《MySQL技術(shù)內(nèi)幕》給出了最簡單的解釋:首先它是一種平衡二叉樹摸屠,所有的記錄都是按大小順序存放在同一層的葉子節(jié)點上,各個葉子節(jié)點用指針彼此相連(B+樹)季二。最終結(jié)果如下圖:
B-Tree索引,就是B-Tree在數(shù)據(jù)庫中的實現(xiàn)税手。(實際上是B+Tree)。
創(chuàng)建索引
根據(jù)創(chuàng)建時機:
1芦倒、建表時創(chuàng)建
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
2、修改表結(jié)構(gòu)時
ALTER mytable ADD INDEX [indexName] ON (username(length))
3麻裳、單獨創(chuàng)建索引
CREATE INDEX indexName ON mytable(username(length));
備注:MySQL中key和index的區(qū)別器钟?
聯(lián)合索引
創(chuàng)建聯(lián)合索引:
alter table j_position add index idx_county_town_village(county_name,town_name,village_name);
聯(lián)合索引是什么?
本質(zhì)上就是上面說的B-Tree索引疆瑰。只不過它得key值是("鳳陽縣","小溪河鎮(zhèn)","小崗村")昙啄。
這些查找情況會使用索引:
A、查找"鳳"開頭的縣
B梳凛、查找鳳陽縣并"小"字開頭的村,是會使用索引的
但是淹接,以下情況不會使用索引:
A叛溢、查找"陽"結(jié)尾的縣
B、查找"小溪河鎮(zhèn)"的鎮(zhèn)
原因——最左前綴匹配楷掉。