整體概述
1.innodb的主索引檔案上 直接存放該行資料,稱為聚簇索引,次索引指向對主鍵的引用
2.myisam中,主索引和次索引,都指向物理行(磁碟位置)
哈哈,說了兩句貌似聽不懂的話。
一。通俗解釋
我們可以這麼理解:
聚簇索引(innodb):索引的葉節點就是資料節點,下邊實打實有資料。
非聚簇索引(myisam): 葉節點仍然是索引節點,有指標指向對應的資料塊。
用圖說明下:
看到了把,不同引擎下的型別是不一樣的。
主要區別是葉子節點下是否有資料塊。
(沒有主鍵他也會建立乙個的..innodb都是聚簇索引來組織的)
二。優缺點:
**問題:
既然是樹結構,葉子節點可能會有**現象
那麼問題來了,
對於非聚簇索引(myisam),節點下儲存的對物理行位址,內容較小,有快取在記憶體中,**快。
對於聚簇索引(innodb),這個問題比較嚴重,節點下儲存這「行資料」
因為節點下有資料檔案,因此節點的**會比較慢,innodb的主鍵,盡量用整形而且的遞增的整形,如果無規律的主鍵資料,在葉子節點儲存時,會**,**的過程得帶著「行資料」重新分,而myisam只記錄了乙個位址,只要把位址**替換即可。
舉例子:
比如,**就像是乙個搬家的過程,對於聚簇索引(innodb),搬家真的要把家裡的所有資料全**搬走,而非聚簇索引(mysiam),只需要把記錄家的門牌號搬走很容易,至於其指向的資料其實不用搬。
三。測試論證:
在innodb引擎下,規律,無規律 兩種方式插入1000條資料。
經過測試,第一種主鍵順序遞增的形式插入,37秒;第二種打亂順序的插入,42秒,整整慢了5秒,**原因是因為亂序插入,需要進行葉子節點的**,它得搬家消耗了時間,也就是說時間差在了節點的**和頁面的移動;而順序插入的很少發生節點**的情況。
對映結論:
1.讀操作多用mysiam引擎
2.選擇單調性的資料為索引,會快一點
更多:mysql-索引總結
下邊驗證一下:
show variables like "%innodb%"
show status;
會發現有乙個欄位->innodb_pages_written (該欄位寫入了多少頁 )
在隨機寫入時,寫入頁的次數要高於順序寫入的,就是因為**移動,所以寫的次數多,時間也用的多,也解釋了為什麼這兩種會存在5秒事件差了。
myisam:
這個是預設型別,它是基於傳統的isam型別,isam是indexed sequential access method (有索引的順序訪問方法) 的縮寫,它是儲存記錄和檔案的標準方法.與其他儲存引擎比較,myisam具有檢查和修復**的大多數工具.
myisam**可以被壓縮,而且它們支援全文搜尋.它們不是事務安全的,而且也不支援外來鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量
的select,myisam是更好的選擇。
innodb:
這種型別是事務安全的.它與bdb型別具有相同的特性,它們還支援外來鍵.innodb**速度很快.具有比bdb還豐富的特性,因此如果需
要乙個事務安全的儲存引擎,建議使用它.如果你的資料執行大量的insert或update,出於效能方面的考慮,應該使用innodb表
mysql 聚簇索引例項 MySQL聚簇索引
mysql作為迭代了很多個版本的資料庫。在資料庫的索引上實現了很多的優化版本,從一開始的只允許乙個表有乙個列為索引值,到目前版本可支援多個列建立索引值,更多關於索引優化版本的描述,以後有機會筆者再寫一篇文章。本文主要介紹索引當中的聚簇索引。mysql官方對聚簇索引的定義是,聚簇索引並不是一種單獨的索...
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...