SQL語句優化必看:3分鐘了解MySQL資料庫索引實現方式!

SQL語句優化必看:3分鐘瞭解MySQL數據庫索引實現方式!

目前MySQL支持的索引主要有哈希索引、B+樹索引、全文索引(fulltext index)、空間索引。平時用到最多的當屬B+樹索引。今天我們就來看看InnoDB和MyISAM存儲引擎的索引實現方式。

InnoDB索引介紹

所謂的B+樹是從平衡二叉樹(AVL)演化來的,它是一個典型的多路平衡搜索樹。

MySQL中InnoDB的B+樹索引分為clustered index和non-clustered index,也就是聚集索引和非聚集索引。聚集索引是按表的主鍵構造一顆B+樹,其葉子節點存放著整條的記錄數據,非聚集索引的葉子節點只保存了主鍵值和對應的偏移量。下圖就是一顆典型的B+樹聚集索引的簡化結構:

SQL語句優化必看:3分鐘瞭解MySQL數據庫索引實現方式!

我們再來看看非聚集索引的:

SQL語句優化必看:3分鐘瞭解MySQL數據庫索引實現方式!

區別十分明顯,葉子結點上存放的數據不同,回想一下,之前說到的覆蓋索引為什麼查找速度會很快(不清楚的先往下看,然後再去翻翻之前文章瞭解)。

覆蓋索引之所以快,是因為省去了二次查找,僅僅查找索引文件便可獲取到所有查詢所需的字段(語句查找字段,條件字段,排序字段都在一個聯合索引中),非聚集索引文件本身就小很多,查找起來非常快。如果查找的字段不全在非聚集索引中,那麼存儲引擎就只能拿到主鍵之後再用主鍵去聚集索引中獲取數據了,在數據量大的情況下就會慢很多。

接下來,我們看看MyISAM的實現方式:

SQL語句優化必看:3分鐘瞭解MySQL數據庫索引實現方式!

無論哪種索引,鍵值上對應的都是數據在磁盤上的物理地址,區別只是主鍵索引的值不能重複而已。

通常,B+樹索引效率都很高,樹的高度並不高,I/O次數較少。但是,它也不是沒有缺點,數據量越大,每次更新數據樹的變動(保持平衡)也越大,超過一定數量後性能便會直線下降,這也是為什麼大表性能低的原因。


分享到:


相關文章: