索引基礎理論知識
二分查找法:在有序數組中查找某一特定元素的搜索算法
優點:比較次數少,查找速度快,平均性能好
缺點:待查表爲有序表,插入刪除困難。所以適用於不常變動而查找頻繁的有序列表
平衡樹,平衡二叉樹
特點:爲一棵空樹和左右兩個子樹的高度差的絕對值不超過1,且左右兩個子樹也是平衡二叉樹
不平衡樹輝通過自旋,變成平衡樹
平衡樹和二叉查找樹最大的區別:前者是平衡的,後者未必
B樹,balanced tree
一個結點可以擁有多於2個結點的多叉查找樹
適合大量數據的讀寫操作,普遍運用在數據庫和文件系統
一棵m階(如4階)的B樹滿足下列條件:
樹中每個結點至多有m個(4個)子結點
除根結點和葉子結點外,其它每個節點至少有m/2個子結點
根結點至少有2個結點
所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字信息
有k個子結點的非終端結點恰好包含k-1個關鍵字
B+樹,B+tree
其基本定義和B-樹相同,除了:
有n棵子樹的結點中含有n-1個關鍵字,每個關鍵字不保存數據,只用來索引,所有數據都保存在葉子結點
所有的葉子結點中包含了全部關鍵字的信息,及指向這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小到大順序鏈接
所有非終端結點可以看成是索引部分,結點中僅含其子樹(根結點)中最大(或最小)的關鍵字
B+樹、哈希索引結構及區別
大量不同數據等值精確查詢,hash索引效率通常比B+tree高
hash索引不支持模糊查找
hash索引不支持聯合索引中的最左匹配規則
hash索引不支持排序
hash索引不支持範圍查詢
索引優點:提高數據檢索效率
提高表空間的join效率
利用唯一性索引,保證數據的唯一性
提高排序和分組效率
缺點:消耗更多物理存儲
數據變更時,索引也需要更新,降低更新效率
索引使用建議:經常檢索的列;經常用於表連接的列;經常排序/分組的列
索引不使用建議:基數很低的列,更新頻繁檢索不頻繁的列;blob/text等長內容列;很少用於檢索的列
主鍵(primary key)
主鍵由表中的一個或多個字段組成,它的值用於唯一地標識表中的某一條記錄
在表引用中,主鍵在一個表中引用來自於另一個表中的特定記錄
保證數據的完整性
加快數據的操作速度
最多只能有一個主鍵,無論什麼引擎
主鍵值不能重複,也不能包含NULL
innodb主鍵特點:
索引定義時,若不顯式包含主鍵,會隱式加入主鍵值;若顯示包含主鍵,會加入主鍵值
5.6.9之後,優化器可以自動識別索引末尾的主鍵值,在之前需要顯式加上主鍵列纔可以被識別
主鍵設計建議:
對業務透明,無意義,免受業務變化的影響
主鍵要很少修改和刪除
主鍵最好是自增的
不要具有動態屬性,如:最後修改時間戳
聚集索引:
該索引中鍵值的邏輯順序決定了表數據行的物理順序
每張表只能建一個聚集索引,除了tokudb引擎
innodb中,聚集索引即表,表即聚集索引,是IOT表
myisam沒有聚集索引的概念,是HOT(堆組織)表
聚集索引的優先選擇列:
含有大量非重複的列
使用between,>,>=,<,<=返回一個範圍值得列
被連續(順序)訪問的列
返回大量結果集的查詢
經常被使用join或group by子句的查詢訪問的列
不建議使用的聚集索引
修改頻繁的列
唯一值很小的列
新增內容太過離散隨機的列
innodb聚集索引選擇順序原則:
顯示聲明的主鍵
第一個不包含null列的唯一索引列
內置的rowid
唯一索引(unique key)
不允許具有索引值相同的行,從而禁止重複的索引或鍵值
在唯一約束上,和主鍵一樣
和主鍵不同的方面(1.唯一索引允許有null;一個表只能有一個主鍵,但可以有多個唯一索引;innodb表主鍵必須是聚集索引,但聚集索引可能不是主鍵;唯一索引約束可臨時禁用,但主鍵不行)
注意:添加唯一索引後還有一種特殊情況,那就是如果該字段沒有限制非空的話,存在插入NULL值的情況,此時,唯一索引並不起作用,也就是你可以插入n條該字段爲null的數據。除此之外,如果插入空字符串的話, 例如 ‘’ ,‘ ’ 不管中間是多少個空字符串在插入的時候都算作‘’ ,即,空串不論多長,只能插入一條。
聯合索引(multiple-column indexes)
多列組成
適合where條件中的多列組合
有時可以避免回表(執行計劃,先索引掃描,再通過rowid去取索引中未能提供的數據)
mysql還不支持多列不同排序規則
覆蓋索引(covering indexes)
通過索引數據結構,即可直接返回數據,不需要回表
執行計劃中,顯示關鍵字using index
部分索引/前綴索引(prefix indexes)
部分索引的原因:1.char/varchar太長,全部作爲索引,效率太差,存在浪費;2.blob/text類型不能整列作爲索引列
alter table t add index (c1(20))
部分索引選擇建議:統計平均值;2/8原則
外鍵/約束(foreign key constraints)
確保存儲在外鍵表中數據的一致性,完整性
外鍵前提:本表列需與外鍵列類型相同(外鍵需時外表的主鍵)
外鍵的選擇原則:1.爲關聯字段創建外鍵;2.所有的鍵都必須唯一;3.避免使用複合鍵;4.外鍵總是關聯唯一的鍵字段
全文索引(fulltext)
5.6之前,只支持myisam。之後,開始支持innodb
優先使用shpinx/lucene/solor等實現中文檢索
mysql索引類型
邏輯分類:
單列索引 (single column indexes)
多列索引(combined indexes)
唯一索引(unique)
非唯一索引(nonunique)
物理存儲分類:
聚集索引(clustered index)
非聚集索引(not-clustered index)
數據結構:
Btree索引
hash索引,只用於heap表
空間索引,使用較少
fractal tree索引,用於tokudb表
譯者介紹:家華,從事mysqlDBA的工作,記錄自己對mysql的一些總結