您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何看待MYSQL 索引,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
我們先看一個(gè)表
select * from employees where first_name = 'Kyoichi' and last_name = 'Maliniak';
按照一般思路,根據(jù)數(shù)據(jù)量我們決定是不是要建立索引,而建立索引針對(duì)這樣的情況,到底那種索引更好。
我們來(lái)做一個(gè)實(shí)驗(yàn),建立為這個(gè)一個(gè)查詢我們建立三個(gè)索引
分別是 first_name last_name first_name_lat_name
可以看到的是查詢執(zhí)行器選擇了 first_name_last_name 這樣的聯(lián)合索引
為什么,我們帶著問(wèn)題繼續(xù)
我這邊將這個(gè)聯(lián)合索引刪除
我們可以看到結(jié)果是什么,結(jié)果是走的一種叫 intersect 方式的索引,
我們還繼續(xù)帶著問(wèn)題看(不要著急,你的問(wèn)題會(huì)在最下面來(lái)進(jìn)行總結(jié)和揭曉)
我們刪除IX_LAST_NAME 這個(gè)索引,然后在繼續(xù)進(jìn)行查詢
OK ,到此,我覺(jué)得可以小結(jié)一下了,
問(wèn)題1 ,那種索引更好
問(wèn)題2,intersect 索引好還是聯(lián)合索引方式好
問(wèn)題3,你為什么刪除了 LAST_NAME 而不刪除 FIRST_NAME
帶著這三個(gè)問(wèn)題,我們繼續(xù)開(kāi)始旅程
在提那種索引更好的情況下,其實(shí)我們應(yīng)該知道這些索引到底給查詢帶來(lái)了什么效應(yīng)。
下面的數(shù)字體現(xiàn)了查詢的cost 值
0.00081800 | select * from employees where first_name = 'Kyoichi' and last_name = 'Maliniak' (復(fù)合索引)
0.00145100 | select * from employees where first_name = 'Kyoichi' and last_name = 'Maliniak' (intersect 索引)
0.00250350 | select * from employees where first_name = 'Kyoichi' and last_name = 'Maliniak' (使用單獨(dú)first_name 索引)
從以上的值上面我們就可以很清楚的看到
Sending data 經(jīng)過(guò)在細(xì)致的查看,具體的cost 的主要發(fā)生在 sending data 這個(gè)階段,另外一個(gè)位置雖然消耗的不同可以在微妙這個(gè)等級(jí),但確實(shí)system lock 這個(gè)東西,比較起來(lái), 復(fù)合索引和intersect 不相伯仲。
所以這次對(duì)比中,可以說(shuō)復(fù)合索引獲勝。
故事就到此結(jié)束了? Nein Nein Nein (我很喜歡Tomas ,這個(gè)梗你懂伐)
我們繼續(xù),建立一個(gè)index IX_first_name_last_name_hire_date
因?yàn)槲覀円肙RDER BY
我們可以通過(guò)圖來(lái)清晰的看出,我們的查詢沒(méi)有走 filesort 直接走了索引,這樣的效率,自然比走filesort 的要好的多,尤其數(shù)據(jù)量較大的情況。
但 但 但,重要的事情的說(shuō)三遍,這個(gè)查詢其實(shí)和上邊雷同,但不一樣的是你的查詢條件變?yōu)榱?LIKE 雖然也走了索引,但最后并未走我們的 using index condition only, 還是帶了 filesort
WHY
我們分析一下,走using index condition only 中的 type 是 ref ,而 走filesort的 卻是, type 是 range , 我們看一下profiling, 頭一個(gè)是range 后面是等值查詢,我們可以清晰的看出,如果走了range 則要多一個(gè)步驟,creating sort index ,并且消耗不低可以說(shuō)占了整體查詢消耗的90%,所以那句能不排序就不排序,在MYSQL 5.7來(lái)說(shuō)還是適用的一句話。
另外本次要戳穿的假象就是,即使你創(chuàng)建了索引,并且也考慮了order by適用的字段加入索引,在某些查詢時(shí),ASC時(shí)他也要 filesort ,而不是向網(wǎng)上有的人說(shuō)的,把ORDER BY 的字段添加到索引,就完全可以不在FILESORT(ASC),這樣的說(shuō)法可不是對(duì)的哦
關(guān)于如何看待MYSQL 索引就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。