mysql索引

索引基礎理論知識

二分查找法:在有序數組中查找某一特定元素的搜索算法

 優點:比較次數少,查找速度快,平均性能好

 缺點:待查表爲有序表,插入刪除困難。所以適用於不常變動而查找頻繁的有序列表

平衡樹,平衡二叉樹

特點:爲一棵空樹和左右兩個子樹的高度差的絕對值不超過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的一些總結
發佈了46 篇原創文章 · 獲贊 19 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章