怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化
大家好,我是閑水,每天更新java最新最熱技術(shù),對(duì)java感興趣的朋友記得關(guān)注一下哦。
注意 :這是SQL性能優(yōu)化第三章,點(diǎn)擊關(guān)注查看前置內(nèi)容。
上篇文章我們主要了解了索引優(yōu)化的標(biāo)尺"Explain"怎么用,這一張,我們就要將索引怎么建立,以及索引失效的例子了。廢話不多說(shuō)我們開(kāi)始。
一 單表查詢建立索引
系統(tǒng)中經(jīng)常出現(xiàn)的sql語(yǔ)句如下: ( SQL_NO_CACHE 是不查找緩存,以免對(duì)我們的結(jié)果造成影響)
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid=4
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 and deptid=4 AND emp.name = 'abcd'
未建索引,0.15s
我們先運(yùn)行一下單表查詢都用了0.15s,這個(gè)效率已經(jīng)很低了(這里我們模擬了一百萬(wàn)條數(shù)據(jù))
索引應(yīng)該如何建立 ?
單表查詢建立索引的規(guī)則是where條件后,最好都建立索引
創(chuàng)建索引:CREATE INDEX idx_age_deptid_name ON emp(age,deptid,NAME)
讓我們看一下索引的效果
建立索引后小數(shù)后兩位已經(jīng)無(wú)法統(tǒng)計(jì)
大家可以看到,索引的效果還是不錯(cuò)的。
第二個(gè)規(guī)則 最佳左前綴法則
如果系統(tǒng)經(jīng)常出現(xiàn)的sql如下:
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.age=30 AND emp.name = 'abcd'
或者
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.deptid=1 AND emp.name = 'abcd'
那原來(lái)的idx_age_deptid_name 還能否正常使用?
用到了一半
沒(méi)用到
可以看到,第一個(gè)只有部分被使用到了,圖二沒(méi)有用到索引
這是為什么呢,這就要說(shuō)到我們的最佳左前綴法則,如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開(kāi)始并且不跳過(guò)索引中的列。
三 不能在索引列上做任何操作(計(jì)算、函數(shù)、(自動(dòng)or手動(dòng))類型轉(zhuǎn)換),會(huì)導(dǎo)致索引失效而轉(zhuǎn)向全表掃描
這兩條sql哪種寫法更好
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE emp.name LIKE 'abc%'
EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE LEFT(emp.name,3) = 'abc'
第一個(gè)
第二個(gè)
切記不要用計(jì)算、函數(shù)、(自動(dòng)or手動(dòng))類型轉(zhuǎn)換。
四.mysql 在使用不等于(!= 或者<>)的時(shí)候無(wú)法使用索引會(huì)導(dǎo)致全表掃描
五.is not null 也無(wú)法使用索引,但是is null是可以使用索引的
六.like以通配符開(kāi)頭('%abc...')mysql索引失效會(huì)變成全表掃描的操作
七.字符串不加單引號(hào)索引失效
八.存儲(chǔ)引擎不能使用索引中范圍條件右邊的列
大家切記在建索引的時(shí)候不要違反這些規(guī)定
下面是我自己總結(jié)的一些建議送給大家:
1.對(duì)于單鍵索引,盡量選擇針對(duì)當(dāng)前query過(guò)濾性更好的索引
2.在選擇組合索引的時(shí)候,當(dāng)前Query中過(guò)濾性最好的字段在索引字段順序中,位置越靠前越好。
3.在選擇組合索引的時(shí)候,盡量選擇可以能夠包含當(dāng)前query中的where字句中更多字段的索引
4.在選擇組合索引的時(shí)候,如果某個(gè)字段可能出現(xiàn)范圍查詢時(shí),盡量把這個(gè)字段放在索引次序的最后面
5.書寫sql語(yǔ)句時(shí),盡量避免造成索引失效的情況。
最后給大家一個(gè)練習(xí)題,看一下自己能答對(duì)幾道題
Where語(yǔ)句 索引是否被使用
where a = 3 Y,使用到a
where a = 3 and b = 5 Y,使用到a,b
where a = 3 and b = 5 and c = 4 Y,使用到a,b,c
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4N
where a = 3 and c = 5 使用到a, 但是c不可以,b中間斷了
where a = 3 and b > 4 and c = 5 使用到a和b, c不能用在范圍之后,b斷了
where a is null and b is not null is null 支持索引 但是is not null 不支持,所以 a 可以使用索引,但是 b不可以使用
where a <> 3 不能使用索引
where abs(a) =3 不能使用 索引
where a = 3 and b like 'kk%' and c = 4Y, 使用到a,b,c
where a = 3 and b like '%kk' and c = 4Y, 只用到a
where a = 3 and b like '%kk%' and c = 4Y, 只用到a
where a = 3 and b like 'k%kk%' and c = 4Y,使用到a,b,c
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 表单和字都居中_APP 分享 | 6 款
- 下一篇: Android日志[基础篇]二 Andr