mysql 聚簇索引实例_MySQL聚簇索引
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存儲引擎的二級索引儲存結構。
圖片介紹:keycolumns為二級索引(灰色行),primarykey為主鍵索引(白色行)
上面還提到了一點,主鍵是一列自增的數值。那么主鍵是否自增對索引的結構產生影響呢?
MySQL官方在這個問題上建議數據庫管理者和應用開發者使用自增的索引,原因是如果使用非自增的索引和不確定長度的索引,會在數據庫寫入大量數據的時候產生很大的性能問題。
因為數據的寫入順序是不確定的,數據需要在原表中尋找一個位置插入,而這個位置通常不是在已有數據的最后,可能是中間,這樣會增加很多額外的工作。同時,因為寫入的位置不確定會使表頻繁的分頁和產生較多的空索引值或者說索引值之間產生很大的空隙,即產生了大量的碎片。這樣一來,對數據的寫入操作就會產生很大的性能問題。
下面放MyISAM存儲引擎的圖片作為和Innodb存儲引擎對比
MyISAM存儲引擎
從圖片可以看出,MyISAM的二級索引是以具體的列值為順序進行
下面兩張圖比較形象地對兩種存儲引擎的主鍵索引和二級索引的指針指向作了一個對比
回歸到問題的最初點—為什么采用聚簇索引查詢速度會更快?原因是聚簇索引的每一個索引值的葉子節點就為數據,只要查詢到對應的主鍵索引值,就可以查詢到對應的哪一行數據,讀取速度相對來說提升了不少。而MyISAM需要特別為索引創建存儲空間來存放,在查詢過程中還要到磁盤中進行數據的讀取。
相對來說聚簇索引的第二個優勢就很好理解了,例如一個關于會員的表記錄了會員的id值,姓名,年齡,性別和手機號,假設手機號是二級索引,在存儲二級索引的時候,會將手機號碼開頭幾位數字相似的手機號存放在一起,例如以135和170開頭的手機號會分在不同的索引表中。在查詢的過程中可以對二級索引的查詢,快速查到手機號以135開頭的那部分會員的信息。而在非聚簇索引表中(MyISAM存儲引擎),主鍵索引和二級索引互相影響(如上圖),在查詢過程就很難實現優化了。
以上是本人對聚簇索引和非聚簇索引的應用場景和優劣勢的對比。另外聚簇索引有時候也會跟覆蓋索引拿出來一起比較,實際上兩種索引是不同的概念,前者描述的是一種數據存儲的結構,后者是描述在數據查詢中直接對索引值的查詢的過程。而在實現的結構基礎上,聚簇索引是基于主鍵列的,覆蓋索引是基于非主鍵列的任何數據列。
總結
以上是生活随笔為你收集整理的mysql 聚簇索引实例_MySQL聚簇索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.4英寸屏幕是多大(2财经频道节目官网
- 下一篇: linux cmake编译源码,linu