1、索引是什麼
索引(index)是幫助mysql高效獲取資料的資料結構。我們可以簡單理解為:索引的目的在於提高查詢效率。
2、原理
索引的資料結構是b+樹,原理圖如下
精簡描述:b+樹是為了磁碟或其他直接儲存輔助裝置設計的一種平衡查詢樹。在b+樹中,所有記錄節點都是按鍵值的大小順序存放在葉子節點上,各葉子節點直接由指標進行連線。
b+樹中的b不是代表二叉(binary),而是代表平衡(balance),因為b+樹是從最早的平衡二叉樹演化而來,但是b+樹不是乙個二叉樹。
索引的內部也是一張表,索引組織表,索引的構建需要使用到磁碟空間跟記憶體空間,並不是索引越多越好,太多反而導致效能下降,建議一張表最多不要超過8個索引。
3、索引分類
下面的分類維度沒有標準,但一般索引我們會比較關注聚集索引跟非聚集索引。
3.1 聚集索引
聚集索引(clustered index)是按照每張表的主鍵構造一棵b+樹,同時葉子節點中存放的即為整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁。
由於實際的資料頁只能按照一棵b+樹進行排序,因此每張表只能擁有乙個聚集索引。
主鍵是乙個聚集索引,如果在innodb沒有定義主鍵,那麼預設生成乙個rowid作為聚集索引。
3.2 非聚集索引
非聚集索引(secondary index,也稱輔助索引),葉子節點並不包含行記錄的全部資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了乙個書籤(bookmark)。該書籤用來告訴innodb儲存引擎**可以找到與索引相對應的行資料。
當通過輔助索引來尋找資料時,innodb儲存引擎會遍歷輔助索引並通過葉級別的指標獲得指向主鍵索引的主鍵,然後再通過主鍵索引來找到乙個完整的行記錄。
3.3 覆蓋索引
從輔助索引中就可以得到查詢的記錄,而不需要查詢聚集索引中的記錄。
使用覆蓋索引的好處是輔助索引不包括整行記錄中的所有資訊,可以減少io操作。
3.4 唯一索引
不允許具有索引值相同的行,從而禁止重複的索引或鍵值。
3.5 聯合索引
聯合索引是指對錶上的多個列進行索引。從本質上來說,聯合索引也是一顆b+樹,不同的是聯合索引的鍵值的數量不是1,而是大於等於2。
索引匹配的原則是最左匹配原則,mysql會一直向右匹配直到遇到範圍查詢(>、
如建立了索引(a,b,c),那麼這些條件語句是可以走到這個索引的,「a=1 and b = 2 and c > 3」、「a=1 and b = 2」,但「b > 1 and d = 10」就沒有走到這個索引了,第乙個命中的必須是「a」。
4、索引的使用
4.1 選擇性:
count(distinct colname)/count(colname) ->1,盡量將選擇性高的列放在索引的最前面,但是也存在例外情況。
典型的例子如性別,一般是不建索引的。
4.2 避免null:
額外儲存,特殊處理;
使索引統計和值更加複雜;
sql執行結果不符合預期
4.3 索引上不要做運算
select id,value from tab where id+10=15 (x)
4.4 多使用聯合索引:
將多個字段建立乙個組合索引
乙個索引可以被多個query利用
減少索參數量,消除重複索引
4.5 避免負向查詢
避免使用not、!=、<>、!、not exists、not in、not like等
5、索引優化
5.1 explain
使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道mysql是如何處理你的sql語句的。分析你的查詢語句或是表結構的效能瓶頸。
一般重點看type、key、rows。
type:表示表的連線型別。常用的型別有: all、index、range、 ref、eq_ref、const、system、null(從左到右,效能從差到好)
key:表示實際使用的索引
rows:掃瞄出的行數(估算的行數),一般這個值越小越好
5.2 cardinality值
索引是否具有高選擇性,一般就可以看cardinality值。
可以通過「show index from table」結果中的列cardinality來觀察,這是乙個預估的值,而不是乙個準確的值,是通過取樣得到的資料。
cardinality/總條數越接近1,越有必要建索引。
5.3 mysql查詢優化器
mysql 查詢優化器的主要功能是完成select語句的執行,在保證select語句正確執行之外,還有乙個重要的功能,就是使用關係代數、啟發式規則、代價估值模型等不同種類的技術,提高select語句的執行效率。
這部分是mysql實現的,可以讓我們的sql寫得更「隨意」。
參考資料
談談MySQL的索引
目錄有什麼用 怎麼用總所周知,資料庫查詢是資料庫的最主要功能之一。我們都希望查詢資料的速度能盡可能的快。而支撐這一快速的背後就是索引 mysql索引問題也是大家經常遇到的面試題模組,想想自己也沒有去系統地總結過索引,所以記錄這篇文章來講下索引。下面還是按照是什麼 有什麼用 怎麼用 來寫 往往大家第一...
mysql模糊查詢索引 MySQL模糊查詢全文索引
全文索引 mysql front dump 2.5 host localhost database test server version 4.0.12 nt log table structure for table t3 create table t3 name char 12 not null...
mysql查詢索引總結
1.使用以下語句檢視表索引 show index from tablename 2.使用以下語句檢視執行計畫 explain select from tablename 注意檢視可用的索引和實際使用的索引。3.檢視慢查詢 show variables like slow 4.聯合索引使用的時候,優先...