校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > MySQL中索引失效的常見場(chǎng)景與規(guī)避方法

MySQL中索引失效的常見場(chǎng)景與規(guī)避方法

熱門標(biāo)簽:400電話申請(qǐng)信用卡 安徽ai電話電銷機(jī)器人有效果嗎 巫師三血與酒地圖標(biāo)注 在哪里申請(qǐng)400電話 走過哪個(gè)省地圖標(biāo)注 常州網(wǎng)絡(luò)外呼系統(tǒng)開發(fā) 萊西市地圖標(biāo)注 銷售語音電話機(jī)器人 外呼系統(tǒng)電銷受騙

前言

之前有看過許多類似的文章內(nèi)容,提到過一些sql語句的使用不當(dāng)會(huì)導(dǎo)致MySQL的索引失效。還有一些MySQL“軍規(guī)”或者規(guī)范寫明了某些sql不能這么寫,否則索引失效。

絕大部分的內(nèi)容筆者是認(rèn)可的,不過部分舉例中筆者認(rèn)為用詞太絕對(duì)了,并沒有說明其中的原由,很多人不知道為什么。所以筆者絕對(duì)再整理一遍MySQL中索引失效的常見場(chǎng)景,并分析其中的原由供大家參考。

當(dāng)然請(qǐng)記住,explain是一個(gè)好習(xí)慣!

MySQL索引失效的常見場(chǎng)景

在驗(yàn)證下面的場(chǎng)景時(shí),請(qǐng)準(zhǔn)備足夠多的數(shù)據(jù)量,因?yàn)閿?shù)據(jù)量少時(shí),MySQL的優(yōu)化器有時(shí)會(huì)判定全表掃描無傷大雅,就不會(huì)命中索引了。

1. where語句中包含or時(shí),可能會(huì)導(dǎo)致索引失效

使用or并不是一定會(huì)使索引失效,你需要看or左右兩邊的查詢列是否命中相同的索引。

假設(shè)USER表中的user_id列有索引,age列沒有索引。

下面這條語句其實(shí)是命中索引的(據(jù)說是新版本的MySQL才可以,如果你使用的是老版本的MySQL,可以使用explain驗(yàn)證下)。

select * from `user` where user_id = 1 or user_id = 2;

但是這條語句是無法命中索引的。

select * from `user` where user_id = 1 or age = 20;

假設(shè)age列也有索引的話,依然是無法命中索引的。

select * from `user` where user_id = 1 or age = 20;

因此才有建議說,盡量避免使用or語句,可以根據(jù)情況盡量使用union all或者in來代替,這兩個(gè)語句的執(zhí)行效率也比or好些。

2. where語句中索引列使用了負(fù)向查詢,可能會(huì)導(dǎo)致索引失效

負(fù)向查詢包括:NOT、!=、>、!、!>、NOT IN、NOT LIKE等。

某“軍規(guī)”中說,使用負(fù)向查詢一定會(huì)索引失效,筆者查了些文章,有網(wǎng)友對(duì)這點(diǎn)進(jìn)行了反駁并舉證。

其實(shí)負(fù)向查詢并不絕對(duì)會(huì)索引失效,這要看MySQL優(yōu)化器的判斷,全表掃描或者走索引哪個(gè)成本低了。

3. 索引字段可以為null,使用is null或is not null時(shí),可能會(huì)導(dǎo)致索引失效

其實(shí)單個(gè)索引字段,使用is null或is not null時(shí),是可以命中索引的,但網(wǎng)友在舉證時(shí)說兩個(gè)不同索引字段用or連接時(shí),索引就失效了,筆者認(rèn)為確實(shí)索引失效,但這個(gè)鍋應(yīng)該由or來背,屬于第一種場(chǎng)景~~

假設(shè)USER表中的user_id列有索引且允許null,age列有索引且允許null。

select * from `user` where user_id is not null or age is not null;

不過某些“軍規(guī)”和規(guī)范中都有強(qiáng)調(diào),字段要設(shè)為not null并提供默認(rèn)值,是有原因值得參考的。

  • null的列使索引/索引統(tǒng)計(jì)/值比較都更加復(fù)雜,對(duì)MySQL來說更難優(yōu)化。
  • null 這種類型MySQL內(nèi)部需要進(jìn)行特殊處理,增加數(shù)據(jù)庫處理記錄的復(fù)雜性;同等條件下,表中有較多空字段的時(shí)候,數(shù)據(jù)庫的處理性能會(huì)降低很多。
  • null值需要更多的存儲(chǔ)空,無論是表還是索引中每行中的null的列都需要額外的空間來標(biāo)識(shí)。
  • 對(duì)null 的處理時(shí)候,只能采用is null或is not null,而不能采用=、in、、>、!=、not in這些操作符號(hào)。如:where name!='shenjian',如果存在name為null值的記錄,查詢結(jié)果就不會(huì)包含name為null值的記錄。

4. 在索引列上使用內(nèi)置函數(shù),一定會(huì)導(dǎo)致索引失效

比如下面語句中索引列l(wèi)ogin_time上使用了函數(shù),會(huì)索引失效:

select * from `user` where DATE_ADD(login_time, INTERVAL 1 DAY) = 7;

優(yōu)化建議,盡量在應(yīng)用程序中進(jìn)行計(jì)算和轉(zhuǎn)換。

其實(shí)還有網(wǎng)友提到的兩種索引失效場(chǎng)景,應(yīng)該都?xì)w于索引列使用了函數(shù)。

4.1 隱式類型轉(zhuǎn)換導(dǎo)致的索引失效

比如下面語句中索引列user_id為varchar類型,不會(huì)命中索引:

select * from `user` where user_id = 12;

這是因?yàn)镸ySQL做了隱式類型轉(zhuǎn)換,調(diào)用函數(shù)將user_id做了轉(zhuǎn)換。

select * from `user` where CAST(user_id AS signed int) = 12;

4.2 隱式字符編碼轉(zhuǎn)換導(dǎo)致的索引失效

當(dāng)兩個(gè)表之間做關(guān)聯(lián)查詢時(shí),如果兩個(gè)表中關(guān)聯(lián)的字段字符編碼不一致的話,MySQL可能會(huì)調(diào)用CONVERT函數(shù),將不同的字符編碼進(jìn)行隱式轉(zhuǎn)換從而達(dá)到統(tǒng)一。作用到關(guān)聯(lián)的字段時(shí),就會(huì)導(dǎo)致索引失效。

比如下面這個(gè)語句,其中d.tradeid字符編碼為utf8,而l.tradeid的字符編碼為utf8mb4。因?yàn)閡tf8mb4是utf8的超集,所以MySQL在做轉(zhuǎn)換時(shí)會(huì)用CONVERT將utf8轉(zhuǎn)為utf8mb4。簡單來看就是CONVERT作用到了d.tradeid上,因此索引失效。

select l.operator from tradelog l , trade_detail d where d.tradeid=l.tradeid and d.id=4;

這種情況一般有兩種解決方案。

方案1: 將關(guān)聯(lián)字段的字符編碼統(tǒng)一。

方案2: 實(shí)在無法統(tǒng)一字符編碼時(shí),手動(dòng)將CONVERT函數(shù)作用到關(guān)聯(lián)時(shí)=的右側(cè),起到字符編碼統(tǒng)一的目的,這里是強(qiáng)制將utf8mb4轉(zhuǎn)為utf8,當(dāng)然從超集向子集轉(zhuǎn)換是有數(shù)據(jù)截?cái)囡L(fēng)險(xiǎn)的。如下:

select d.* from tradelog l , trade_detail d where d.tradeid=CONVERT(l.tradeid USING utf8) and l.id=2; 

5. 對(duì)索引列進(jìn)行運(yùn)算,一定會(huì)導(dǎo)致索引失效

運(yùn)算如+,-,*,/等,如下:

select * from `user` where age - 1 = 10;

優(yōu)化的話,要把運(yùn)算放在值上,或者在應(yīng)用程序中直接算好,比如:

select * from `user` where age = 10 - 1;

6. like通配符可能會(huì)導(dǎo)致索引失效

like查詢以%開頭時(shí),會(huì)導(dǎo)致索引失效。解決辦法有兩種:

將%移到后面,如:

select * from `user` where `name` like '李%';

利用覆蓋索引來命中索引。

select name from `user` where `name` like '%李%';

7. 聯(lián)合索引中,where中索引列違背最左匹配原則,一定會(huì)導(dǎo)致索引失效

當(dāng)創(chuàng)建一個(gè)聯(lián)合索引的時(shí)候,如(k1,k2,k3),相當(dāng)于創(chuàng)建了(k1)、(k1,k2)和(k1,k2,k3)三個(gè)索引,這就是最左匹配原則。

比如下面的語句就不會(huì)命中索引:

select * from t where k2=2;
select * from t where k3=3;
slect * from t where k2=2 and k3=3;

下面的語句只會(huì)命中索引(k1):

slect * from t where k1=1 and k3=3;

8. MySQL優(yōu)化器的最終選擇,不走索引

上面有提到,即使完全符合索引生效的場(chǎng)景,考慮到實(shí)際數(shù)據(jù)量等原因,最終是否使用索引還要看MySQL優(yōu)化器的判斷。當(dāng)然你也可以在sql語句中寫明強(qiáng)制走某個(gè)索引。

優(yōu)化索引的一些建議

  • 禁止在更新十分頻繁、區(qū)分度不高的屬性上建立索引。
    • 更新會(huì)變更B+樹,更新頻繁的字段建立索引會(huì)大大降低數(shù)據(jù)庫性能。
    • “性別”這種區(qū)分度不大的屬性,建立索引是沒有什么意義的,不能有效過濾數(shù)據(jù),性能與全表掃描類似。
  • 建立組合索引,必須把區(qū)分度高的字段放在前面。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

參考

《為什么這些SQL語句邏輯相同,性能卻差異巨大?》

《后端程序員必備:索引失效的十大雜癥》

《58到家數(shù)據(jù)庫30條軍規(guī)解讀》

《MySQL的or/in/union與索引優(yōu)化 | 架構(gòu)師之路》

您可能感興趣的文章:
  • mysql索引失效的幾種情況分析
  • Mysql 5.6 "隱式轉(zhuǎn)換"導(dǎo)致的索引失效和數(shù)據(jù)不準(zhǔn)確的問題
  • MySQL索引失效的幾種情況詳析
  • MySQL索引失效的幾種情況匯總
  • 導(dǎo)致MySQL索引失效的一些常見寫法總結(jié)
  • mysql的in會(huì)不會(huì)讓索引失效?
  • MySQL中有哪些情況下數(shù)據(jù)庫索引會(huì)失效詳析
  • mysql索引失效的五種情況分析
  • Mysql索引會(huì)失效的幾種情況分析
  • MySQL索引失效的典型案例

標(biāo)簽:鞍山 來賓 河北 赤峰 果洛 黃石 陽江 煙臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL中索引失效的常見場(chǎng)景與規(guī)避方法》,本文關(guān)鍵詞  MySQL,中,索引,失效,的,常見,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL中索引失效的常見場(chǎng)景與規(guī)避方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL中索引失效的常見場(chǎng)景與規(guī)避方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产a视频精品免费观看| 欧美日本视频在线| 欧美裸体bbwbbwbbw| 亚洲一区二区三区四区在线免费观看 | 国产一区二区三区精品视频| 精品国产91久久久久久久妲己| 国产福利视频一区二区三区| 综合久久一区二区三区| 欧美日韩你懂得| 狠狠狠色丁香婷婷综合久久五月| 国产欧美视频一区二区| 在线观看一区日韩| 国产在线视频一区二区三区| 中文字幕一区在线观看视频| 欧美乱妇23p| 舔着乳尖日韩一区| 国产精品日日摸夜夜摸av| 色综合天天综合网天天看片| 青青草精品视频| 亚洲日本欧美天堂| 久久先锋影音av| 欧美日韩国产综合一区二区三区| 国产美女娇喘av呻吟久久| 亚洲一区中文在线| 国产精品青草久久| 日韩欧美一级二级三级久久久| 成人国产精品免费观看视频| 日本亚洲免费观看| 亚洲综合男人的天堂| 国产偷v国产偷v亚洲高清| 欧美蜜桃一区二区三区| 97精品国产露脸对白| 狠狠网亚洲精品| 欧美aaaaaa午夜精品| 亚洲成人一区在线| 亚洲精品免费电影| 亚洲三级视频在线观看| 欧美国产乱子伦| 26uuu亚洲综合色| 欧美xingq一区二区| 欧美卡1卡2卡| 欧美在线观看视频在线| 91美女视频网站| 99视频热这里只有精品免费| 国产麻豆一精品一av一免费| 久久国产精品72免费观看| 亚洲第一精品在线| 午夜电影一区二区| 丝袜国产日韩另类美女| 亚洲成年人影院| 亚洲3atv精品一区二区三区| 亚洲国产精品影院| 午夜精品123| 日本在线观看不卡视频| 肉肉av福利一精品导航| 午夜精品福利久久久| 日韩精品国产欧美| 老司机免费视频一区二区三区| 麻豆一区二区三| 国内精品久久久久影院薰衣草| 日本不卡免费在线视频| 91麻豆免费视频| 91社区在线播放| 色悠悠久久综合| 欧美绝品在线观看成人午夜影视| 在线播放日韩导航| 精品区一区二区| 欧美高清在线一区二区| 中文字幕在线一区二区三区| 亚洲乱码国产乱码精品精98午夜| 性感美女久久精品| 日本一不卡视频| 国产一区二区三区蝌蚪| 99re这里都是精品| 在线不卡a资源高清| 久久综合九色综合欧美98| 国产精品不卡一区| 婷婷一区二区三区| 国产一区二区三区不卡在线观看| 成人动漫视频在线| 欧美日韩日日骚| 精品第一国产综合精品aⅴ| 国产精品免费视频观看| 亚洲国产精品人人做人人爽| 九九九精品视频| 91福利社在线观看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 久久97超碰色| 色综合久久中文字幕| 欧美一级久久久| 亚洲欧美日韩在线不卡| 美女视频一区二区三区| 91色|porny| 欧美激情综合网| 青青草视频一区| 欧美伊人久久大香线蕉综合69| 26uuu色噜噜精品一区二区| 亚洲影院免费观看| 成人高清免费在线播放| 欧美大胆人体bbbb| 一区二区三区四区高清精品免费观看| 久久不见久久见免费视频7| 91麻豆国产精品久久| 国产日韩高清在线| 男女性色大片免费观看一区二区 | 日韩欧美国产一区二区在线播放| 亚洲欧洲无码一区二区三区| 蜜桃传媒麻豆第一区在线观看| 色狠狠色噜噜噜综合网| 国产精品久久看| 国产一区二区三区视频在线播放| 欧美久久久久免费| 亚洲色欲色欲www| 懂色av一区二区在线播放| 精品免费视频.| 免费一级片91| 欧美成人三级电影在线| 偷拍自拍另类欧美| 欧美日韩中文一区| 亚洲综合久久av| 欧洲精品一区二区| 亚洲影视在线观看| 欧美伊人久久大香线蕉综合69| 亚洲天堂免费在线观看视频| 波多野结衣在线一区| 国产欧美一区二区精品性色 | 午夜伦理一区二区| 欧美色爱综合网| 图片区小说区国产精品视频| 欧美日韩黄视频| 日日嗨av一区二区三区四区| 欧美日韩国产精选| 日韩影视精彩在线| 欧美成人a∨高清免费观看| 久久国产精品一区二区| 久久久久久久久久久99999| 国产精品亚洲一区二区三区妖精| 久久久久久久久久电影| av激情成人网| 亚洲伊人色欲综合网| 8x8x8国产精品| 极品销魂美女一区二区三区| 国产色产综合产在线视频| caoporm超碰国产精品| 一区二区三区不卡视频在线观看| 欧美丝袜自拍制服另类| 麻豆精品久久精品色综合| 久久精品日韩一区二区三区| jizzjizzjizz欧美| 亚洲成人1区2区| 国产欧美日韩视频一区二区| 91蝌蚪porny| 日日摸夜夜添夜夜添国产精品| 精品精品国产高清一毛片一天堂| 国产suv精品一区二区三区| 亚洲精选视频免费看| 欧美一级欧美三级在线观看 | 国产调教视频一区| 在线精品亚洲一区二区不卡| 日本不卡在线视频| 国产精品全国免费观看高清 | 久久久91精品国产一区二区精品| 成人激情免费电影网址| 亚洲一区在线观看视频| 久久综合成人精品亚洲另类欧美 | 911精品产国品一二三产区| 国产在线视频一区二区三区| 亚洲激情一二三区| 久久久久久久电影| 欧洲色大大久久| 成人av集中营| 精品制服美女久久| 亚洲午夜久久久久久久久久久 | 欧美激情一区二区三区蜜桃视频 | 国产一区二区不卡在线| 一区二区三区在线视频免费 | 精品一区二区三区久久| 亚洲精品国久久99热| 日本一区二区三区四区在线视频| 欧美精品自拍偷拍| 99精品久久只有精品| 极品少妇xxxx精品少妇| 午夜电影网亚洲视频| 亚洲人精品午夜| 久久久电影一区二区三区| 欧美另类z0zxhd电影| 成人app下载| 国产盗摄一区二区三区| 七七婷婷婷婷精品国产| 视频在线观看国产精品| 一区二区三区毛片| 亚洲女同一区二区| 亚洲欧美一区二区三区国产精品| 国产日产欧产精品推荐色 | 粉嫩av一区二区三区在线播放| 久久精品72免费观看| 久热成人在线视频| 久草这里只有精品视频| 精品一区二区免费在线观看| 开心九九激情九九欧美日韩精美视频电影|