索引覆蓋
也叫聚簇索引,是一種資料儲存方式(將索引和資料儲存在一起),是按照每張表的主鍵構造一顆b+樹,同時葉子節點中存放的就是整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁。這個特性決定了索引組織表中資料也是索引的一部分,每張表只能擁有乙個聚簇索引。b+樹將資料儲存與索引放到了一塊,找到索引也就找到了資料,innodb聚集索引的葉子節點儲存行記錄,因此, innodb必須要有,且只有乙個聚集索引:
(1)如果表定義了主鍵pk,則pk就是聚集索引;
(2)如果表沒有定義pk,則第乙個非空唯一鍵not null unique列是聚集索引;
(3)否則,innodb會建立乙個隱藏的row-id作為聚集索引;
innodb中,在聚簇索引之上建立的索引稱之為輔助索引,輔助索引訪問資料總是需要二次查詢,非聚簇索引都是輔助索引,像復合索引、字首索引、唯一索引,輔助索引葉子節點儲存的不再是行的物理位置,而是主鍵值。簡記為,第一次找到主鍵值,第二次根據主鍵值找到行資料。
innodb輔助索引的葉子節點並不包含行記錄的全部資料,葉子節點除了包含鍵值外,還包含了相應行資料的聚簇索引鍵。
輔助索引的存在不影響資料在聚簇索引中的組織,所以一張表可以有多個輔助索引。在innodb中有時也稱輔助索引為二級索引,該方法存在回表查詢(根據查詢到的輔助索引葉子節點的主鍵值,再次查詢資料,它的效能較掃一遍索引樹更低)。
在myisam中,不管是不是主鍵,還是普通索引,葉子節點上儲存的都是資料的物理磁碟的引用位址,當查詢到這個引用位址,就可以將這份資料載入到記憶體。在innodb中,使用的就是上面的聚簇索引, 在主鍵(或者系統預設的隱式乙個主鍵索引)的葉子節點上, 儲存的是資料行的真實資訊. 其他索引(輔助索引)的葉子節點都是這個主鍵索引的關鍵字的值。
myisam的具體結構
2.innodb的具體結構
mysql可以使用索引直接獲取列的資料,這樣就不需要進行讀取資料行,如果索引樹的葉子節點已經包含要查詢的資料(即在一棵索引樹上就能獲取sql所需的所有列資料)就稱之為索引覆蓋,無需回表查詢,速度更快。
使用explain,可以通過輸出的extra列來判斷,對於乙個索引覆蓋查詢,顯示為using index,mysql查詢優化器在執行查詢前會決定是否有索引覆蓋查詢。
可參考博文:
比較詳細)
常見的方法是:將被查詢的字段,建立到聯合索引裡去。盡可能的在select後只寫必要的查詢字段,以增加索引覆蓋的機率。
mysql 聚簇索引表 Mysql的聚簇索引
聚簇索引並不是一種單獨的索引型別,而是一種資料儲存方式。innodb的聚簇索引實際上是在同乙個結構中儲存了b tree索引和資料行。乙個表只能有乙個聚簇索引。innodb中,葉子頁包含了行的全部資料,但是節點頁只包含了索引列。innodb通過主鍵聚集資料。優點 1.可以把相關資料儲存在一起。例如實現...
mysql 聚簇索引例項 MySQL聚簇索引
mysql作為迭代了很多個版本的資料庫。在資料庫的索引上實現了很多的優化版本,從一開始的只允許乙個表有乙個列為索引值,到目前版本可支援多個列建立索引值,更多關於索引優化版本的描述,以後有機會筆者再寫一篇文章。本文主要介紹索引當中的聚簇索引。mysql官方對聚簇索引的定義是,聚簇索引並不是一種單獨的索...
mysql聚簇索引設定 Mysql 聚簇索引
整體概述 1.innodb的主索引檔案上 直接存放該行資料,稱為聚簇索引,次索引指向對主鍵的引用 2.myisam中,主索引和次索引,都指向物理行 磁碟位置 哈哈,說了兩句貌似聽不懂的話。一。通俗解釋 我們可以這麼理解 聚簇索引 innodb 索引的葉節點就是資料節點,下邊實打實有資料。非聚簇索引 ...