索引的目的
創(chuàng)建索引的目的是為了提高查詢的效率,就像書的目錄一樣。
索引的常見模型
哈希索引:哈希索引以K-V存儲??梢栽贠(1)的時間復雜度找到元素。適合精確的等值查找,不適合范圍查找。
有序數組:有序數組因為是有序的所以適合范圍查找,但是如果數據會更改變化的話有序數組的維護成本高,所以一幫用于靜態(tài)的數據表。
B+樹:B+樹由于其非葉子節(jié)點不保存數據,數據保存在葉子結點上,并且葉子節(jié)點相連的特點,適合用于范圍查找,并且樹的出隊度非常大,樹的高度低,所以訪問磁盤的數量很少。
為什么用B+樹做索引
- B+樹的非葉子節(jié)點不保存數據,這樣可以減少內存。
- B+樹的高度一般不超過3,相對于紅黑樹,其磁盤I/O數量少,效率高。
- B+樹的葉子節(jié)點保存數據,并且葉子節(jié)點相連,適合范圍查找。
MyISAM和Innodb中B+樹索引的不同
- MyISAM:數據和索引樹分開存儲,索引樹的葉子節(jié)點保存的是數據的地址。主鍵索引和非主鍵索引都是一樣的。
- Innodb:數據文件本身就是索引文件,主鍵索引中葉子結點保存了數據,非主鍵索引中的葉子結點保存的是主鍵索引的值,所以非主鍵索引查找數據需要經兩次查詢,一次非主鍵索引表的查詢,查詢出主鍵值之后再查詢主鍵索引表,第二次操作稱之為回表。
為什么要用自增的主鍵,唯一的主鍵可以嗎?
首先說結論,自增主鍵將會使索引緊湊,每一次的新增操作都是順序添加。而唯一的主鍵新增的值是隨機的,會涉及到樹的移動,并且樹葉沒有那么緊湊,導致分頁,由于分頁,在數據的查找中可能還會有更多的磁盤I/O操作去查找頁。
簡單的索引優(yōu)化
- 在非主鍵索引中需要回表操作,覆蓋索引可以避免會表。
覆蓋索引:假如你所要查詢的值都在索引樹上,則可避免回表操作。
- 最左前綴匹配:對于聯合索引,只能匹配到符合最左原則的索引。
- 索引下推:假如在最左前綴匹配下,不能匹配的就需要會表判斷,但是假如where查詢的未匹配的字段是聯合索引中的字段,那么會在第一次查詢的時候就先判斷了是否成立,減少了回表的次數,這就是索引下推。
索引的建立和重建
為什么要索引前面說過了,那么為什么要重建索引呢?在innodb引擎中,隨著數據的變更,索引文件會變的非常大,并且不那么緊湊,占用非常大的內存。所以重建索引是很有必要。那么怎么判斷一個索引需要重建了呢?
對一個索引進行結構分析后,
‐‐如果該索引占用超過了一個數據塊,且滿足以下條件之一:B‐tree樹的高度大于3;
‐‐使用百分比低于75%;數據刪除率大于15%,就需要考慮對索引重建
另外,當我們刪除主鍵索引的時候,會將其他索引也刪除,所以可以用alert table engine =innodb來重建表。