索引

??InnoDB支持B+樹(shù)索引舌剂、全文索引、哈希索引三種索引方式。

B+樹(shù)的創(chuàng)建和刪除操作

??B+樹(shù)的B是平衡(Balance)的意思辆它。
??B+ 樹(shù)索引并不能找到一個(gè)給定鍵值的具體行瘪撇。 B+ 樹(shù)索引能找到的只是被查找數(shù)據(jù)行所在的頁(yè)获茬。然后數(shù)據(jù)庫(kù)通過(guò)把頁(yè)讀入到內(nèi)存,再在內(nèi)存中進(jìn)行查找倔既,最后得到要查找的數(shù)據(jù)恕曲。
??在數(shù)據(jù)庫(kù)中,B+樹(shù)的高度一般都在2~4層渤涌,也就是說(shuō)查找某一鍵值的行記錄時(shí)佩谣,最多只需要2到4次IO。


創(chuàng)建和刪除索引

??索引的創(chuàng)建和刪除可以通過(guò)兩種方法实蓬,一種是alter table 茸俭,另一種是create /drop index。用戶可以設(shè)置對(duì)整個(gè)列的數(shù)據(jù)進(jìn)行索引安皱,也可以只索引一個(gè)列的開(kāi)頭部分?jǐn)?shù)據(jù)调鬓。

alter table tbl_name
| add {index|key} {index_name}
{index_type} (index_col_name,...) [index_option]...

alter table tbl_name
drop primary key
|drop {index|key} index_name
create [unique] index index_name
[index_type]
on tbl_name(index_col_name,...)

drop index index_name on tbl_name;

show index命令和Cardinality值

查看表中索引的信息
show index from table_name

??show index from table_name命令輸出中,有一個(gè)Cardinality值酌伊,表示索引中唯一值的估計(jì)值腾窝,這個(gè)值不是實(shí)時(shí)的,可以使用命令analyze table進(jìn)行實(shí)時(shí)更新,該值越大越好虹脯,應(yīng)該盡可能接近表的行數(shù)驴娃,對(duì)于性別、地區(qū)這些值循集,一般Cardinality都比較小唇敞,不建議建立索引。
??在 InnoDB存儲(chǔ)引擎中, Cardinality統(tǒng)計(jì)信息的更新發(fā)生在兩個(gè)操作中: INSERT和 UPDATE咒彤。根據(jù)前面的敘述,不可能在每次發(fā)生 INSERT和 UPDATE時(shí)就去更新Cardinality信息,這樣會(huì)增加數(shù)據(jù)庫(kù)系統(tǒng)的負(fù)荷,同時(shí)對(duì)于大表的統(tǒng)計(jì),時(shí)間上也不允許數(shù)據(jù)庫(kù)這樣去操作厚棵。因此, InnoDB存儲(chǔ)引擎內(nèi)部對(duì)更新 Cardinality信息的策略為:

  • 表中116的數(shù)據(jù)已發(fā)生過(guò)變化
  • stat_modified_counter>2000000000

??第一種策略為自從上次統(tǒng)計(jì) Cardinality信息后,表中1/16的數(shù)據(jù)已經(jīng)發(fā)生過(guò)變化,這時(shí)需要更新 Cardinality信息。第二種情況考慮的是,如果對(duì)表中某一行數(shù)據(jù)頻繁地進(jìn)行更新操作,這時(shí)表中的數(shù)據(jù)實(shí)際并沒(méi)有增加,實(shí)際發(fā)生變化的還是這一行數(shù)據(jù),則第一種更新策略就無(wú)法適用這這種情況蔼紧。故在 InnoDB存儲(chǔ)引擎內(nèi)部有一個(gè)計(jì)數(shù)器stat_modified_counter,用來(lái)表示發(fā)生變化的次數(shù),當(dāng) stat_modified_counter大于2000000000時(shí),則同樣需要更新 Cardinality信息婆硬。

覆蓋索引

??即從輔助索引中就可以得到查詢的記錄, 而不需要查詢聚集索引中的記錄奸例。 使用覆蓋索引的一個(gè)好處是輔助索引不包含整行記錄的所有信息彬犯, 故其大小要遠(yuǎn)小于聚集索引, 因此可以減少大量的 IO 操作查吊。
??對(duì)于InnoDB存儲(chǔ)引擎的輔助索引而言谐区,由于其包含了主鍵信息,因此其葉子節(jié)點(diǎn)存放的數(shù)據(jù)為(primary key1逻卖,priamey key2宋列,…,key1,key2评也,…)炼杖。例如,下面語(yǔ)句都可僅使用一次輔助聯(lián)合索引來(lái)完成查詢:

SELECT key2 FROM table WHERE key1=xxx;
SELECT primary key2,key2 FROM table key1=xxx;
SELECT primary key1,key2 FROM table key1=xxx;
SELECT primary key1,primary key2,key2 FROM table key1=xxx;

??有時(shí)進(jìn)行統(tǒng)計(jì)count()操作時(shí)盗迟,因?yàn)楦采w索引樹(shù)數(shù)據(jù)量比較小坤邪,可以減少I(mǎi)O操作,因此InnoDB會(huì)選擇覆蓋索引罚缕。

哈希索引

??InnoDB存儲(chǔ)引擎支持的哈希索引是自適應(yīng)的艇纺,InnoDB存儲(chǔ)引擎會(huì)根據(jù)表的使用情況自動(dòng)為表生成哈希索引,不能人為干預(yù)是否在一張表中生成哈希索引邮弹。
??InnoDB存儲(chǔ)引擎使用哈希算法來(lái)對(duì)字典進(jìn)行查找黔衡,其沖突機(jī)制采用鏈表方式,哈希函數(shù)采用除法散列方式腌乡。對(duì)于緩沖池頁(yè)的哈希表來(lái)說(shuō)盟劫,在緩沖池中的Page頁(yè)都有一個(gè)chain指針。它指向相同哈希函數(shù)值的頁(yè)导饲。而對(duì)于除法散列捞高,m的取值略大于2倍的緩沖池頁(yè)數(shù)量的質(zhì)數(shù)。例如:當(dāng)前參數(shù)innodb_buffer_pool_size的大小為10M,則共有640個(gè)16kb的頁(yè)渣锦。對(duì)于緩沖池頁(yè)內(nèi)存的哈希表來(lái)說(shuō)硝岗,需要分配640*2=1280個(gè)槽,但是由于1280不是質(zhì)數(shù),需要取比1280略大的一個(gè)質(zhì)數(shù),應(yīng)該是1399,所以在啟動(dòng)時(shí)會(huì)分配1399個(gè)槽的哈希表袋毙,用來(lái)哈希查詢所在緩沖池中的頁(yè)
??那么在InnoDB存儲(chǔ)引擎的緩沖池對(duì)于其中的頁(yè)是怎么進(jìn)行查找的呢型檀?上面只是給出了一般的算法,怎么將查找的頁(yè)轉(zhuǎn)換成自然數(shù)呢?
??其實(shí)很簡(jiǎn)單,InnoDB存儲(chǔ)引擎的表空間都有一個(gè)space_id听盖,用戶所要查找的應(yīng)該是某個(gè)表空間某個(gè)連續(xù)16KB的頁(yè)胀溺,即偏移量offset,InnoDB存儲(chǔ)引擎將space_id左移20位皆看,然后加上這個(gè)space_id和offset仓坞,即關(guān)鍵字K=space_id<<20+space_id+offset,然后通過(guò)除法散列到各個(gè)槽中。

自適應(yīng)哈希索引

??innodb存儲(chǔ)引擎有一個(gè)特殊的功能叫自適應(yīng)哈希索引(adaptive hash index),當(dāng)innodb注意到某些索引值被使用的非常頻繁時(shí)腰吟,它會(huì)在內(nèi)存中基于B+樹(shù)索引上再創(chuàng)建一個(gè)哈希索引无埃。這就讓B+樹(shù)索引也具有一些哈希索引的優(yōu)點(diǎn),比如快速的哈希查找毛雇。這是一個(gè)完全自動(dòng)嫉称,內(nèi)部的行為,用戶無(wú)法控制或配置灵疮。

全文索引

??在InnoDB中织阅,全文索引使用full inverted index實(shí)現(xiàn)。

??full inverted index震捣,其表現(xiàn)形式為{單詞荔棉,(單詞所在文檔的ID,在具體文檔中的位置)}蒿赢,如下例子江耀。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诉植,隨后出現(xiàn)的幾起案子祥国,更是在濱河造成了極大的恐慌导狡,老刑警劉巖荒典,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剖效,居然都是意外死亡灼擂,警方通過(guò)查閱死者的電腦和手機(jī)壁查,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剔应,“玉大人睡腿,你說(shuō)我怎么就攤上這事语御。” “怎么了席怪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵应闯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挂捻,道長(zhǎng)碉纺,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任刻撒,我火速辦了婚禮骨田,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘声怔。我一直安慰自己态贤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布醋火。 她就那樣靜靜地躺著抵卫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胎撇。 梳的紋絲不亂的頭發(fā)上介粘,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音晚树,去河邊找鬼姻采。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爵憎,可吹牛的內(nèi)容都是我干的慨亲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宝鼓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刑棵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起愚铡,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛉签,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沥寥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碍舍,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年邑雅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了片橡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淮野,死狀恐怖捧书,靈堂內(nèi)的尸體忽然破棺而出吹泡,到底是詐尸還是另有隱情,我是刑警寧澤经瓷,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布爆哑,位于F島的核電站,受9級(jí)特大地震影響了嚎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜廊营,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一歪泳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧露筒,春花似錦呐伞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘪吏,卻和暖如春癣防,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掌眠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工蕾盯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓝丙。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓级遭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渺尘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挫鸽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351