數目 | 索引前三個字符 |
---|---|
500 | abc |
465 | asd |
455 | acd |
431 | zaf |
430 | aaa |
420 | vvv |
411 | asv |
512 |
如果每一列的數據都比較大,說明區分度還不高需要增大索引字符數,直到這個前綴的選擇性接近完整列的索引性,也就是前面的數據要盡可能的小。
計算完整列的選擇性,并使前綴的選擇性接近于完整列的選擇性。下面語句用戶計算完整列選擇性:
-- 不同字符串的數目/總的數目就是完整列選擇性 select count(distinct name)/count(*) from person;
下面語句計算索引前 3 個字段選擇性:
-- 前3個字符不同的字符串數據/總的數據 select count(distincy left(city,3))/count(*) from person
不斷增大索引字符數目,直到選擇性接近完整列選擇性且繼續增大數據選擇性提升幅度不大的時候。
創建方法
-- 假設最佳長度為4 alter table person add key (name(4));
多列索引
不少人有這樣的誤解,如果一個查詢用有多個字段 ‘and'查詢,那么給每個字段都建立索引不就能最大化提高效率了?事實并不是如此,mysql 只會選擇其中一個字段來進行索引查找。這種情況下應該建立多列索引(又叫聯合索引),就能利用多個索引字段了,注意索引列順序要和查詢的順序一致。
在 5.0 及以上版本中引入了“索引合并”的策略。一定程度上也可以使用多個單列索引,比如下面的查詢:
-- mysql會分別使用name和age索引查出數據然后合并 -- 如果使and則查出數據后再對比取交集 select * from person where name = "bob" or age=12
但是不推薦這么做,and 或 or條件過多會耗費大量的 CPU 和內存在算法的緩存、排序和合并操作上。
選擇合適的索引列順序
在一個多列 B-Tree 索引中,索引列的順序意味著索引首先是按照最左列進行排序,然后是第二列…索引一個良好的多列索引應該是將選擇性最高的索引放在最前面,然后依次降低,這樣才能更好的利于索引。選擇性計算方發見:前綴索引 小節。
聚族索引
聚族索引不是一種單獨的索引類型,而是一種數據存儲方法,具體的細節依賴其實現方式。
InnoDB 的聚族索引實際是在同一個結構中保存索引值和數據行。因為不能同時將數據行放在兩個不同的地方,所以一個表只能有一個聚族索引。InnoDB 的聚族索引列為“主鍵列”。
如果沒有定義主鍵,InnoDB 會選擇一個唯一的非空索引代替。如果這樣的索引也沒有,InnoDB 會隱式定義一個主鍵來作為聚族索引。
聚族索引的主要優點是:可以把相關數據保存在一起,減少磁盤 IO,提高查詢效率。但是也有缺點:
覆蓋索引
簡單來說就是一個索引覆蓋了需要查詢的列字段,這樣就不需要再到聚族索引中利用主鍵進行二次查找,在一個二級索引中就能取到所需的數據。
InnoDB 的索引會在葉子節點中保存索引值,因此如果要查詢的字段全部包含在某個索引中,且這個索引被使用了,那么就能極大的提高查詢速度。比如如下查詢語句:
-- name有索引的情況下,直接從索引的葉子節點中取name值返回,無需二次查找 select name from person where name = 'abc' -- 如果存在`name,age`聚合索引,也會直接返回數據,無需二次查找 select name,age from person where name='abc' and age=12
使用索引進行排序
mysql 的排序操作也是可以利用索引的,只有當索引的列順序和ORDER BY的順序完全一致,并且所有列的排序方法(正序或者倒序)也一樣時,才能夠使用索引來進行排序。注意:排序的字段可以比對應的索引字段少,但是順序必須一致。如下:
-- 假設有:(name,age,sex)聯合索引 -- 可使用索引排序 select ... order by name desc,age desc select ... order by name desc,age desc,sex desc -- 不可使用排序 select ... order by name desc,sex desc select ... order by name desc,age asc
結束
本篇基于 mysql 5.5 的版本,更新的版本可能會有不一樣的策略。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
標簽:梅河口 北京 陜西 黔西 荊門 駐馬店 昌都 鄂爾多斯
巨人網絡通訊聲明:本文標題《高效利用mysql索引指南》,本文關鍵詞 高效,利用,mysql,索引,指南,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。