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