標籤:圖片 primary 雜湊索引 支援 重要 表數 主鍵索引 優勢 事務
叢集索引
聚簇索引並不是一種單獨的索引類型,而是一種資料存放區方式(不是資料結構,而是儲存結構),具體細節依賴於其實現方式,聚簇索引實際上是在同一個結構中儲存了btree索引和資料行.
innodb將通過主鍵聚集資料,如果沒有定義主鍵,Innodb會選擇第一個非空的唯一索引代替,如果沒有非空唯一索引,Innodb會隱式定義一個6位元組的rowid主鍵來作為叢集索引
葉子頁包含了行的全部資料,但是節點頁只包含了索引列(或者可以說非葉子節點的節點頁包含的是索引值的索引,因為這些節點頁包含的值是從索引列中提取出來的)
因為叢集索引和表資料是放在一起的,所以一個表中只能有一個叢集索引
innodb和myisam實體儲存體的資料分布對比:
myisam:
是按照資料插入的順序儲存在磁碟上的,myisam中的主鍵索引和二級索引在結構上並沒有什麼不同,主鍵索引就是一個名為primary的唯一非空索引.
innodb:
因為innodb支援叢集索引,所以使用非常不同的方式儲存同樣的資料,innodb叢集索引包含了整個表的資料,而不是只有索引,因為在Innodb中,叢集索引就是表,所以不像myisam那樣需要獨立的行儲存.叢集索引的每一個葉子節點都包含了主索引值,事務ID,用於事務和MVCC的復原指標以及所有剩餘列的值,如果主鍵是一個列首碼索引,innodb也會包含完整的主鍵列和剩下的列的值。
還有一點和myisam不同的是,innodb的二級索引和叢集索引很不同,innodb二級索引的葉子節點中儲存的不是行指標,而是主索引值,並以此作為指向行的指標,這樣的策略減少了當出現行移動或者資料頁的分裂時二級索引的維護工作,使用主索引值當做指標會讓二級索引佔用更多的空間,換來的好處是,innodb在移動行時無須更新二級索引中的這個指標.
叢集索引的好處:
資料訪問更快,叢集索引將索引和資料儲存在同一個btree中,因此從叢集索引中擷取資料通常比在非叢集索引中尋找要快(通過索引直接找到資料)
叢集索引的壞處:
聚簇資料最大限度地提高了IO密集型應用的效能,但如果資料全部放在記憶體中,則訪問的順序就沒有那麼重要了,叢集索引也就沒有什麼優勢
插入資料操作成本比較大
二級索引可能比想象的更大,因為在二級索引的葉子節點包含了引用行的主鍵列
二級索引訪問需要兩次索引尋找,而不是一次
因為二級索引葉子節點中儲存的不是指向行的物理位置的指標,而是行的主索引值.這意味著通過二級索引尋找行,儲存引擎需要找到二級索引的葉子節點獲得對應的主索引值
然後根據這個主索引值去叢集索引中尋找對應的行,這裡做了重複的工作,兩次btree尋找而不是一次,對於innodb,自適應雜湊索引能減少這樣的重複工作.
Mysql叢集索引的使用