全文大約【1404】字,不說廢話,只講可以讓你學(xué)到技術(shù)、明白原理的純干貨!本文帶有豐富案例及配圖視頻,讓你更好的理解和運(yùn)用文中的技術(shù)概念,并可以給你帶來具有足夠啟迪的思考......
一. 索引
在上一章節(jié)中小編講解了索引的基本入門。那么在這一節(jié)中我們來探討下索引的深層原理。各位小伙伴準(zhǔn)備好了嗎,我們開始嘍!
1.索引的設(shè)計(jì)原則
索引的設(shè)計(jì)可以遵循一些已有的原則,創(chuàng)建索引的時(shí)候請(qǐng)盡量考慮符合這些原則,便于提升索引的使用效率,更高效的使用索引。
2.創(chuàng)建索引的原則:
● 對(duì)查詢頻次較高,且數(shù)據(jù)量比較大的表建立索引。
● 使用唯一索引,區(qū)分度越高,使用索引的效率越高。
● 索引字段的選擇,最佳候選列應(yīng)當(dāng)從where子句的條件中提取,如果where子句中的組合比較多,那么應(yīng)當(dāng)挑選最常用、過濾效果最好的列的組合。
● 使用短索引,索引創(chuàng)建之后也是使用硬盤來存儲(chǔ)的,因此提升索引訪問的I/O效率,也可以提升總體的訪問效率。假如構(gòu)成索引的字段總長度比較短,那么在給定大小的存儲(chǔ)塊內(nèi)可以存儲(chǔ)更多的索引值,相應(yīng)的可以有效的提升MySQL訪問索引的I/O效率。
● 索引可以有效的提升查詢數(shù)據(jù)的效率,但索引數(shù)量不是多多益善,索引越多,維護(hù)索引的代價(jià)自然也就水漲船高。對(duì)于插入、更新、刪除等DML操作比較頻繁的表來說,索引過多,會(huì)引入相當(dāng)高的維護(hù)代價(jià),降低DML操作的效率,增加相應(yīng)操作的時(shí)間消耗。另外索引過多的話,MySQL也會(huì)犯選擇困難病,雖然最終仍然會(huì)找到一個(gè)可用的索引,但無疑提高了選擇的代價(jià)。
3.聯(lián)合索引的使用
在mysql建立聯(lián)合索引時(shí)會(huì)遵循最左前綴匹配的原則,即最左優(yōu)先,在檢索數(shù)據(jù)時(shí)從聯(lián)合索引的最左邊開始匹配,對(duì)列name列、address和列phone列建一個(gè)聯(lián)合索引。
ALTER TABLE user ADD INDEX index_three(name,address,phone);
聯(lián)合索引index_three實(shí)際建立了(name)、(name,address)、(name,address,phone)三個(gè)索引。所以下面的三個(gè)SQL語句都可以命中索引。
SELECT * FROM user WHERE address = '北京' AND phone = '12345' AND name = '張三';
SELECT * FROM user WHERE name = '張三' AND address = '北京';
SELECT * FROM user WHERE name = '張三';
上面三個(gè)查詢語句執(zhí)行時(shí)會(huì)依照最左前綴匹配原則,檢索時(shí)分別會(huì)使用下面索引。進(jìn)行數(shù)據(jù)匹配。
(name,address,phone)
(name,address)
(name)
索引的字段可以是任意順序的,小編舉個(gè)栗子:
-- 優(yōu)化器會(huì)幫助我們調(diào)整順序,下面的SQL語句都可以命中索引
SELECT * FROM user WHERE address = '北京' AND phone = '12345' AND name = '張三';
Mysql的優(yōu)化器會(huì)幫助我們調(diào)整where條件中的順序,以匹配我們建立的索引。
聯(lián)合索引中最左邊的列不包含在條件查詢中,所以根據(jù)上面的原則,下面的SQL語句就不會(huì)命中索引。
-- 聯(lián)合索引中最左邊的列不包含在條件查詢中,下面的SQL語句就不會(huì)命中索引
SELECT * FROM user WHERE address = '北京' AND phone = '12345';
二. 結(jié)語
小編在這里對(duì)本文核心要點(diǎn)進(jìn)行總結(jié):
熟練記住并理解創(chuàng)建索引的原則和聯(lián)合索引的使用,本章節(jié)主要就是講索引的使用原則和聯(lián)合索引的使用。