mysql 聚簇索引例項 MySQL聚簇索引

2021-10-17 22:30:51 字數 2601 閱讀 8034

mysql作為迭代了很多個版本的資料庫。在資料庫的索引上實現了很多的優化版本,從一開始的只允許乙個表有乙個列為索引值,到目前版本可支援多個列建立索引值,更多關於索引優化版本的描述,以後有機會筆者再寫一篇文章。本文主要介紹索引當中的聚簇索引。

mysql官方對聚簇索引的定義是,聚簇索引並不是一種單獨的索引類,而是一種資料儲存方式,第一次看到這段描述,我相信很多人都會一頭霧水,索引是一種資料儲存結構?這怎麼解釋?下面筆者一步一步來講述mysql對聚簇索引的定義和具體運用。

首先上貼一張圖

在mysql中,有一列值,專門被設定為聚簇索引,這列值就是主鍵,通常為數字型別的字段。那麼如果資料表中沒有主鍵呢?mysql的解決辦法是隱式地將乙個唯一的非空的列定義為聚簇。那如果這也沒有呢?mysql就自己建立乙個聚簇索引,具體這個聚簇索引內部是怎麼建立的,筆者還需要去學習學習。反正無論如何,mysql都會建立乙個聚簇索引。

那麼為什麼說聚簇索引是一種資料儲存結構呢?原因是mysql將索引(即主鍵)對應的每一條記錄都以鍊錶的形式儲存在索引的葉子頁中,那麼很容易理解,聚簇索引就是表,而反過來說,表以聚簇索引的形式來儲存。那麼是所有的mysql儲存引擎都採用聚簇索引這種資料儲存結構嗎?答案是否定的,在mysql中,只用innodb引擎才採用聚簇索引,其他的儲存引擎像myisam採用非聚簇索引。

那麼接下來的問題是聚簇索引有什麼優勢,它的這種優勢是因為什麼產生的?本人學習過程中總結了以下幾點。

1. 採用聚簇索引,索引和其他列值儲存在一起,在查詢過程中利用b-tree查詢,搜尋速率很快。而採用非聚簇索引(如myisam引擎),在查詢上比innodb相對要慢得多。

2. 聚簇索引內部實現了將相類似的資料存放在一起,當需要查詢相類似的內容時,只需要查詢比較少的資料頁就可以實現對資料的獲取。

為了理解第一點優勢,我們還需要去理解二級索引的一些相關問題。

在innodb中,二級索引除了儲存本身的列值外,其葉子節點儲存的不是『行指標』,而是主鍵值,為什麼是這樣呢?原來這種方式在表結構發生變化的時候會有很大的優勢。如果二級索引的儲存順序是以列值為基礎的,那麼在發生資料行的移動或者增加刪除時候,必定會引起索引結構的巨大變化,舉個例子:在myisam儲存引擎的表結構,索引的儲存順序是以數值大小或者字串的字母為基準的,如果有這麼一列資料age是數字型別,當其中的一條資料的age改變之後,跟在它後面的資料的順序要重新排列,修改後的資料插入原來的表中也需要花費一番功夫。而innodb的優勢在於,以主鍵為順序(通常主鍵是沒有任何實際意義的一列自增的數值),因為主鍵是順序的,自增的,就不會出現說因為二級索引值的改變而使一條資料在表中移動過程中產生巨大影響甚至改變了表的結構。但有乙個缺點是innodb的二級索引的這類指標會加大了二級索引的儲存空間。當資料量很大的時候,還是會有一定的空間壓力的。

下圖是innodb儲存引擎的二級索引儲存結構。

上面還提到了一點,主鍵是一列自增的數值。那麼主鍵是否自增對索引的結構產生影響呢?

mysql官方在這個問題上建議資料庫管理者和應用開發者使用自增的索引,原因是如果使用非自增的索引和不確定長度的索引,會在資料庫寫入大量資料的時候產生很大的效能問題。

因為資料的寫入順序是不確定的,資料需要在原表中尋找乙個位置插入,而這個位置通常不是在已有資料的最後,可能是中間,這樣會增加很多額外的工作。同時,因為寫入的位置不確定會使表頻繁的分頁和產生較多的空索引值或者說索引值之間產生很大的空隙,即產生了大量的碎片。這樣一來,對資料的寫入操作就會產生很大的效能問題。

下面放myisam儲存引擎的作為和innodb儲存引擎對比

myisam儲存引擎

從可以看出,myisam的二級索引是以具體的列值為順序進行

下面兩張圖比較形象地對兩種儲存引擎的主鍵索引和二級索引的指標指向作了乙個對比

回歸到問題的最初點—為什麼採用聚簇索引查詢速度會更快?原因是聚簇索引的每乙個索引值的葉子節點就為資料,只要查詢到對應的主鍵索引值,就可以查詢到對應的哪一行資料,讀取速度相對來說提公升了不少。而myisam需要特別為索引建立儲存空間來存放,在查詢過程中還要到磁碟中進行資料的讀取。

相對來說聚簇索引的第二個優勢就很好理解了,例如乙個關於會員的表記錄了會員的id值,姓名,年齡,性別和手機號,假設手機號是二級索引,在儲存二級索引的時候,會將手機號碼開頭幾位數字相似的手機號存放在一起,例如以135和170開頭的手機號會分在不同的索引表中。在查詢的過程中可以對二級索引的查詢,快速查到手機號以135開頭的那部分會員的資訊。而在非聚簇索引表中(myisam儲存引擎),主鍵索引和二級索引互相影響(如上圖),在查詢過程就很難實現優化了。

以上是本人對聚簇索引和非聚簇索引的應用場景和優劣勢的對比。另外聚簇索引有時候也會跟覆蓋索引拿出來一起比較,實際上兩種索引是不同的概念,前者描述的是一種資料儲存的結構,後者是描述在資料查詢中直接對索引值的查詢的過程。而在實現的結構基礎上,聚簇索引是基於主鍵列的,覆蓋索引是基於非主鍵列的任何資料列。

mysql聚簇索引設定 Mysql 聚簇索引

整體概述 1.innodb的主索引檔案上 直接存放該行資料,稱為聚簇索引,次索引指向對主鍵的引用 2.myisam中,主索引和次索引,都指向物理行 磁碟位置 哈哈,說了兩句貌似聽不懂的話。一。通俗解釋 我們可以這麼理解 聚簇索引 innodb 索引的葉節點就是資料節點,下邊實打實有資料。非聚簇索引 ...

mysql 聚簇索引表 Mysql的聚簇索引

聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。innodb的聚簇索引實際上是在同乙個結構中儲存了b tree索引和資料行。乙個表只能有乙個聚簇索引。innodb中,葉子頁包含了行的全部資料,但是節點頁只包含了索引列。innodb通過主鍵聚集資料。優點 1.可以把相關資料儲存在一起。例如實現...

MySQL 聚簇索引 和 非聚簇索引

索引節點的葉子頁面就好比一片葉子。葉子頭便是索引鍵值。先建立一張表 create table user id intnot null name varchar notnull class varchar notnull 對於myisam引擎,如果建立 id 和 name 為索引。對於下面查詢 sel...