引言聚簇索引並不是一種索引型別,只是一種儲存方式。當表有了聚簇索引的時候,表的資料行都存放在索引樹的葉子頁中。無法把資料行放到兩個不同的地方,所以一張表只允許有乙個聚簇索引。
索引使得大多數時候我們避免全表掃瞄,使資料的效能有一定的提高。而聚簇索引的影響力也是很大的。我們熟悉的myisam和innodb兩大引擎,innodb的預設資料結構是聚簇索引,而myisam是非聚簇索引。
innodb是通過主鍵來聚集資料的,就是「被索引的列就是主鍵」。如果一張表沒有主鍵,那就會通過某一唯一列來聚集資料,沒有唯一列的時候,就會隱式的生成乙個id,通過這個id來聚集資料。
區別1. 在mysql安裝目錄上,我們也可以明顯的看出兩者的區別:
我們可在安裝目錄下查到這兩個目錄。這兩個目錄的my指的是myisam引擎,d是data,i是index。
但是我們確找不到ini和ind之類的檔案,只能查到一些idb檔案。這也就是提現出聚簇索引和非聚簇索引的一點區別了:
a):在myisam引擎索引和資料是分開儲存的,而innodb是索引和資料是一起以idb檔案的形式進行儲存的。
b):在訪問速度上,聚簇索引比非聚簇索引快。非聚簇索引需要先查詢一遍索引檔案,得到索引,跟據索引獲取資料。而聚簇索引的索引樹的葉子節點的直接指向要查詢的資料行。
2. :從二級索引查詢看
對於採用聚簇索引的innodb引擎的主鍵索引b+tree和myisam的主鍵索引樹還有myisam的二級索引b+tree都是採用這樣的結構。但是innodb的二級索引b+tree卻是這樣的:
所以可以得出:
在使用二級索引進行查詢的時候,innodb首先通過二級索引b+tree得到資料行的主鍵索引,然後再通過主鍵索引樹查詢資料。所以在二級索引,innodb的效能消耗比較大。
但是,這種情況在innodb中有一定的優化,不是認為控制的,而是引擎實現的,通過二級索引查詢多了,innodb會生成自適應的雜湊索引。
擴充套件問題
根據b+tree的插入過程,取什麼樣的主鍵會帶來什麼問題?
使用自增主鍵比其它主鍵好,因為根據b+tree的插入,主鍵採用自增主鍵會保證每次都在最後面增加葉子節點。不會帶來新資料的插入,導致前面的資料變動,而產生頁**,隨之帶來空間碎片和時間的消耗。
但是使用自增主鍵,這樣的主鍵有上界啊,而且在併發的情況下怎麼保證獲取到的主鍵是正確的?怎麼解決上界問題?
對於併發怎麼保證獲取的主鍵是正確的,可以看innodb的auto_increment鎖機制。遇到這種問題則可能要考慮重新設計表,或者更改innodb_auotinc_lock_mode引數。
對於上界問題,自己還沒有更好的認識,有遇到過的朋友可以告訴一下解決方案。
還有很多問題需要理解,則還需要繼續學。
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以存...
聚簇索引和非聚簇索引
一 聚簇索引 clustered indexes 的使用 聚簇索引是一種對磁碟上實際資料重新組織以按指定的乙個或多個列的值排序。由於聚簇索引的索引頁面指標指向資料頁面,所以使用聚簇索引查詢資料幾 乎總是比使用非聚簇索引快。每張表只能建乙個聚簇索引,並且建聚簇索引需要至少相當該錶120 的附加空間,以...