mysql 索引類型


mysql是索引組織表(IOT)

堆組織表(HOT)和索引組織表(IOT)的區別

 

mysql 索引功能

提高數據檢查效率

提高表間的JOIN效率

唯一約束,保證數據一致

提高排序和分組效率

占用物理空間

數據變更時,索引也隨之更新,效率低

 

索引創建時機

select 頻繁的列

where 條件join的列

經常排序/分組的列

不建議創建索引的情況:基數低、更新頻繁但查詢不多,大字段(BLOB/TEXT),不怎么使用的列

 

 

 

主鍵索引

primary key,唯一標識一行記錄,不能重復,不能為NULL

業務不能使用

不修改,少刪除

最好自增,非自增列做主鍵會造成較嚴重的空間浪費

不使用隨機值

 

 

聚集索引/Clustered index

一定程序決定數據的存儲順序,每張表只能有一個

TokuDB引擎可以有多個聚集索引,MyISAM 沒有聚集索引

primary key 是聚集索引,但聚集索引不一定是主鍵索引;

innodb的表不要求必須有主鍵,但一定會有聚集索引,因為innodb是索引組織表

 

聚集索引優先選擇列的條件

INT/BIGINT

數據連接(單調順序)遞增/自增

如果表中有主鍵,inndb會選擇主鍵索引作為主鍵索引;

不建議的列:頻繁修改、新增數據太過離散

 

innodb聚集索引選擇次序

顯式聲明的主鍵

第一個NOT NULLABLE的唯一索引

ROWID(實例級/庫級,6bytes)

 

索引后會自動增加主鍵值

索引的葉子節點,定義時不管是否包含了主鍵,都會自動存儲主鍵值,用於回溯表。

alter table test add i1(c1,c2) 與alter test test add i1(c1,c2,id) 效果相同,innodb自動為每個索引涉及的字段的末尾增加了主鍵列;

 mysql5.6.9之后,優化器可自動識別索引末尾的值(index extensions)

 

唯一索引

唯一約束

可以為NULL

一個表可以有多個

唯一索引可以臨時禁用,主鍵不可以

 

聯合索引

多列組成,適合where條件中的多列組合

可用於避免回表(回表,索引上沒有要查找的數據,需要通過主鍵找到整行數據,然后再讀取需要的列)

將過濾性大的列放在聯合索引的最左邊,盡量在第一次過濾時,去除大量數據

mysql8.0開始支持倒序索引,聯合索引中可支持不同的排序規則

 

覆蓋索引

索引中包含全部要查詢的列,不需要再通過主鍵去訪問整行數據,即不需要回表;

執行計划中,Extra using index 

 

分區表索引

mysql分區表的索引也是全局的,與非分區表的索引一樣,不支持單個分區的索引。所以沒有分區表索引這一概念。

 

索引的存儲結構

詳見:Mysql索引底層數據結構與算法

 

索引相關書箱推薦

  • 保證正版 數據庫索引設計與優化 (美)拉赫登邁奇,(美)利奇,曹怡倩,趙建偉 電子工業出版社
 
保證正版 數據庫索引設計與優化 (美)拉赫登邁奇,(美)利奇,曹怡倩,趙建偉 電子工業出版社

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM