日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化

發(fā)布時(shí)間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 怎么看我装的sql能不能用_深入浅出sql优化(三)之单表索引优化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是閑水,每天更新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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。