索引的目的
創(chuàng)建索引的目的是為了提高查詢的效率挖滤,就像書的目錄一樣。
索引的常見模型
哈希索引:哈希索引以K-V存儲景鼠≈亵幔可以在O(1)的時間復(fù)雜度找到元素。適合精確的等值查找铛漓,不適合范圍查找溯香。
有序數(shù)組:有序數(shù)組因為是有序的所以適合范圍查找,但是如果數(shù)據(jù)會更改變化的話有序數(shù)組的維護(hù)成本高浓恶,所以一幫用于靜態(tài)的數(shù)據(jù)表玫坛。
B+樹:B+樹由于其非葉子節(jié)點不保存數(shù)據(jù),數(shù)據(jù)保存在葉子結(jié)點上包晰,并且葉子節(jié)點相連的特點湿镀,適合用于范圍查找,并且樹的出隊度非常大伐憾,樹的高度低勉痴,所以訪問磁盤的數(shù)量很少。
為什么用B+樹做索引
- B+樹的非葉子節(jié)點不保存數(shù)據(jù)树肃,這樣可以減少內(nèi)存蒸矛。
- B+樹的高度一般不超過3,相對于紅黑樹胸嘴,其磁盤I/O數(shù)量少雏掠,效率高。
- B+樹的葉子節(jié)點保存數(shù)據(jù)劣像,并且葉子節(jié)點相連乡话,適合范圍查找。
MyISAM和Innodb中B+樹索引的不同
- MyISAM:數(shù)據(jù)和索引樹分開存儲耳奕,索引樹的葉子節(jié)點保存的是數(shù)據(jù)的地址绑青。主鍵索引和非主鍵索引都是一樣的。
- Innodb:數(shù)據(jù)文件本身就是索引文件屋群,主鍵索引中葉子結(jié)點保存了數(shù)據(jù)时迫,非主鍵索引中的葉子結(jié)點保存的是主鍵索引的值,所以非主鍵索引查找數(shù)據(jù)需要經(jīng)兩次查詢谓晌,一次非主鍵索引表的查詢掠拳,查詢出主鍵值之后再查詢主鍵索引表,第二次操作稱之為回表纸肉。
為什么要用自增的主鍵溺欧,唯一的主鍵可以嗎喊熟?
首先說結(jié)論,自增主鍵將會使索引緊湊姐刁,每一次的新增操作都是順序添加芥牌。而唯一的主鍵新增的值是隨機的,會涉及到樹的移動聂使,并且樹葉沒有那么緊湊壁拉,導(dǎo)致分頁,由于分頁柏靶,在數(shù)據(jù)的查找中可能還會有更多的磁盤I/O操作去查找頁弃理。
簡單的索引優(yōu)化
- 在非主鍵索引中需要回表操作,覆蓋索引可以避免會表屎蜓。
覆蓋索引:假如你所要查詢的值都在索引樹上痘昌,則可避免回表操作。
- 最左前綴匹配:對于聯(lián)合索引炬转,只能匹配到符合最左原則的索引辆苔。
- 索引下推:假如在最左前綴匹配下,不能匹配的就需要會表判斷扼劈,但是假如where查詢的未匹配的字段是聯(lián)合索引中的字段驻啤,那么會在第一次查詢的時候就先判斷了是否成立,減少了回表的次數(shù)荐吵,這就是索引下推街佑。
索引的建立和重建
為什么要索引前面說過了,那么為什么要重建索引呢捍靠?在innodb引擎中,隨著數(shù)據(jù)的變更森逮,索引文件會變的非常大榨婆,并且不那么緊湊,占用非常大的內(nèi)存褒侧。所以重建索引是很有必要良风。那么怎么判斷一個索引需要重建了呢?
對一個索引進(jìn)行結(jié)構(gòu)分析后闷供,
‐‐如果該索引占用超過了一個數(shù)據(jù)塊烟央,且滿足以下條件之一:B‐tree樹的高度大于3;
‐‐使用百分比低于75%歪脏;數(shù)據(jù)刪除率大于15%疑俭,就需要考慮對索引重建
另外,當(dāng)我們刪除主鍵索引的時候婿失,會將其他索引也刪除钞艇,所以可以用alert table engine =innodb來重建表啄寡。