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分區表的索引也是全局的,與非分區表的索引一樣,不支持單個分區的索引。所以沒有分區表索引這一概念。
索引的存儲結構
索引相關書箱推薦