天天看點

MySQL資料庫索引實作方式

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

InnoDB索引介紹

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

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

MySQL資料庫索引實作方式

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

MySQL資料庫索引實作方式

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

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

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

MySQL資料庫索引實作方式

無論哪種索引,鍵值上對應的都是資料在磁盤上的實體位址,差別隻是主鍵索引的值不能重複而已。

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

版權聲明:本文為CSDN部落客「weixin_33862993」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33862993/article/details/91635332