婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL中索引失效的常見場景與規避方法

MySQL中索引失效的常見場景與規避方法

熱門標簽:400電話申請信用卡 安徽ai電話電銷機器人有效果嗎 巫師三血與酒地圖標注 在哪里申請400電話 走過哪個省地圖標注 常州網絡外呼系統開發 萊西市地圖標注 銷售語音電話機器人 外呼系統電銷受騙

前言

之前有看過許多類似的文章內容,提到過一些sql語句的使用不當會導致MySQL的索引失效。還有一些MySQL“軍規”或者規范寫明了某些sql不能這么寫,否則索引失效。

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

當然請記住,explain是一個好習慣!

MySQL索引失效的常見場景

在驗證下面的場景時,請準備足夠多的數據量,因為數據量少時,MySQL的優化器有時會判定全表掃描無傷大雅,就不會命中索引了。

1. where語句中包含or時,可能會導致索引失效

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

假設USER表中的user_id列有索引,age列沒有索引。

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

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

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

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

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

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

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

2. where語句中索引列使用了負向查詢,可能會導致索引失效

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

某“軍規”中說,使用負向查詢一定會索引失效,筆者查了些文章,有網友對這點進行了反駁并舉證。

其實負向查詢并不絕對會索引失效,這要看MySQL優化器的判斷,全表掃描或者走索引哪個成本低了。

3. 索引字段可以為null,使用is null或is not null時,可能會導致索引失效

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

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

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

不過某些“軍規”和規范中都有強調,字段要設為not null并提供默認值,是有原因值得參考的。

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

4. 在索引列上使用內置函數,一定會導致索引失效

比如下面語句中索引列login_time上使用了函數,會索引失效:

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

優化建議,盡量在應用程序中進行計算和轉換。

其實還有網友提到的兩種索引失效場景,應該都歸于索引列使用了函數。

4.1 隱式類型轉換導致的索引失效

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

select * from `user` where user_id = 12;

這是因為MySQL做了隱式類型轉換,調用函數將user_id做了轉換。

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

4.2 隱式字符編碼轉換導致的索引失效

當兩個表之間做關聯查詢時,如果兩個表中關聯的字段字符編碼不一致的話,MySQL可能會調用CONVERT函數,將不同的字符編碼進行隱式轉換從而達到統一。作用到關聯的字段時,就會導致索引失效。

比如下面這個語句,其中d.tradeid字符編碼為utf8,而l.tradeid的字符編碼為utf8mb4。因為utf8mb4是utf8的超集,所以MySQL在做轉換時會用CONVERT將utf8轉為utf8mb4。簡單來看就是CONVERT作用到了d.tradeid上,因此索引失效。

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

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

方案1: 將關聯字段的字符編碼統一。

方案2: 實在無法統一字符編碼時,手動將CONVERT函數作用到關聯時=的右側,起到字符編碼統一的目的,這里是強制將utf8mb4轉為utf8,當然從超集向子集轉換是有數據截斷風險的。如下:

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

5. 對索引列進行運算,一定會導致索引失效

運算如+,-,*,/等,如下:

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

優化的話,要把運算放在值上,或者在應用程序中直接算好,比如:

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

6. like通配符可能會導致索引失效

like查詢以%開頭時,會導致索引失效。解決辦法有兩種:

將%移到后面,如:

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

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

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

7. 聯合索引中,where中索引列違背最左匹配原則,一定會導致索引失效

當創建一個聯合索引的時候,如(k1,k2,k3),相當于創建了(k1)、(k1,k2)和(k1,k2,k3)三個索引,這就是最左匹配原則。

比如下面的語句就不會命中索引:

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

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

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

8. MySQL優化器的最終選擇,不走索引

上面有提到,即使完全符合索引生效的場景,考慮到實際數據量等原因,最終是否使用索引還要看MySQL優化器的判斷。當然你也可以在sql語句中寫明強制走某個索引。

優化索引的一些建議

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

參考

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

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

《58到家數據庫30條軍規解讀》

《MySQL的or/in/union與索引優化 | 架構師之路》

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

標簽:鞍山 來賓 河北 赤峰 果洛 黃石 陽江 煙臺

巨人網絡通訊聲明:本文標題《MySQL中索引失效的常見場景與規避方法》,本文關鍵詞  MySQL,中,索引,失效,的,常見,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL中索引失效的常見場景與規避方法》相關的同類信息!
  • 本頁收集關于MySQL中索引失效的常見場景與規避方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品国产三级国产专播品爱网| 国产人妖乱国产精品人妖| 丝袜亚洲另类丝袜在线| 91麻豆免费视频| 亚洲国产精品成人综合| 国产成人小视频| 国产亲近乱来精品视频| 裸体健美xxxx欧美裸体表演| 亚洲6080在线| 7777精品伊人久久久大香线蕉完整版| 国产精品电影一区二区三区| 日韩主播视频在线| 精品电影一区二区| 丝袜美腿成人在线| 国产精品视频yy9299一区| 综合电影一区二区三区| 亚洲午夜久久久久久久久久久 | 久久免费精品国产久精品久久久久 | 青青草原综合久久大伊人精品优势 | 国产精品区一区二区三区| 91免费在线视频观看| 久久精品一区二区三区av| 久久超碰97中文字幕| 国产精品久久久久婷婷| 精品粉嫩超白一线天av| 粉嫩一区二区三区性色av| 91论坛在线播放| 精品国产露脸精彩对白| 中文字幕一区二区视频| 日韩精品1区2区3区| 国产超碰在线一区| 久久99国产精品成人| 国产高清不卡二三区| 色拍拍在线精品视频8848| 欧美精品日韩一本| 国产拍欧美日韩视频二区| 亚洲精品ww久久久久久p站| 免费观看久久久4p| 色噜噜狠狠成人中文综合| 国产在线国偷精品免费看| 日韩电影在线一区二区| 在线一区二区三区四区| 日韩无一区二区| 日韩欧美高清一区| 亚洲综合视频在线| 狠狠色狠狠色综合| 日本乱人伦一区| 亚洲国产精品二十页| 亚洲欧洲国产日韩| 国产精品福利电影一区二区三区四区| 精品久久久久久久久久久久久久久久久 | 欧美经典三级视频一区二区三区| 日日骚欧美日韩| 国产999精品久久久久久绿帽| 久久久美女毛片| 亚洲少妇30p| 91首页免费视频| 亚洲一区在线电影| 91.com在线观看| 麻豆精品精品国产自在97香蕉| 欧美成人伊人久久综合网| 激情综合网最新| 一区二区不卡在线播放| 91精品国产福利在线观看| 国产在线一区观看| 国产精品国产三级国产普通话三级 | 亚洲视频在线一区二区| 91网站在线播放| 亚洲尤物在线视频观看| 一本大道av一区二区在线播放 | 欧美电影免费观看高清完整版在线 | 一区二区三区久久| 精品视频免费看| 亚洲黄色录像片| 日韩色视频在线观看| 国产一区二区三区日韩| 日韩毛片精品高清免费| 99久久久免费精品国产一区二区| 亚洲香肠在线观看| 欧美人与z0zoxxxx视频| 日本午夜一区二区| 久久精品综合网| 日韩一二在线观看| a4yy欧美一区二区三区| 天天色天天爱天天射综合| 国产成a人亚洲| 亚洲人xxxx| 免费欧美在线视频| 三级在线观看一区二区| 欧美一区二区精品久久911| 国产suv精品一区二区883| 亚洲一区二区三区爽爽爽爽爽| 欧美三级日本三级少妇99| 韩国精品久久久| 亚洲伦在线观看| 日韩欧美成人一区| 91精品国产一区二区三区| 成人国产一区二区三区精品| 首页国产欧美日韩丝袜| 国产精品色在线观看| 精品av综合导航| 911精品国产一区二区在线| 9人人澡人人爽人人精品| 精品一区中文字幕| 日韩av不卡在线观看| 亚洲人成网站影音先锋播放| 国产亚洲一二三区| 欧美日韩你懂的| 在线播放日韩导航| 色偷偷一区二区三区| 高清日韩电视剧大全免费| 日韩av在线发布| 日本不卡一区二区三区高清视频| 中文字幕在线一区二区三区| 亚洲精品免费一二三区| 精品sm捆绑视频| 欧美剧在线免费观看网站| 在线观看免费成人| aaa欧美日韩| 国产99久久久国产精品潘金网站| 美女爽到高潮91| 国模少妇一区二区三区| 日韩国产高清影视| 亚洲国产综合人成综合网站| 亚洲成人动漫在线免费观看| 视频一区中文字幕国产| 久久精品噜噜噜成人88aⅴ| 国产又粗又猛又爽又黄91精品| 国产黄色精品网站| 91在线观看视频| 欧美精品久久一区| 久久久亚洲午夜电影| 亚洲欧洲日韩女同| 午夜久久电影网| 久久丁香综合五月国产三级网站| 国产精品羞羞答答xxdd| 色婷婷av久久久久久久| 欧美高清视频不卡网| 久久尤物电影视频在线观看| 中文字幕在线视频一区| 亚洲国产精品久久不卡毛片| 久草精品在线观看| k8久久久一区二区三区| 51精品国自产在线| 日本一区二区三区久久久久久久久不| 中文字幕一区av| 日韩精品久久理论片| 欧美日本一道本在线视频| 欧美亚洲高清一区二区三区不卡| 精品视频在线看| 精品国产麻豆免费人成网站| 中文字幕在线一区二区三区| 亚洲永久精品大片| 紧缚捆绑精品一区二区| 一本色道久久加勒比精品 | 欧美一二三四区在线| 日本一区二区三区高清不卡 | 国内久久精品视频| 一本大道久久a久久综合| 色综合天天综合网国产成人综合天 | 亚洲视频中文字幕| 午夜影院久久久| 99精品欧美一区| 欧美妇女性影城| 国产香蕉久久精品综合网| 亚洲激情校园春色| 免费的国产精品| 欧美另类高清zo欧美| 国产成人av资源| 欧美人与性动xxxx| 国产精品嫩草影院av蜜臀| 欧美aaa在线| 欧美亚洲免费在线一区| 欧美激情一区不卡| 麻豆精品新av中文字幕| 精品视频999| 亚洲精选视频免费看| 国产91高潮流白浆在线麻豆| 日韩欧美激情在线| 亚洲愉拍自拍另类高清精品| caoporen国产精品视频| 精品入口麻豆88视频| 日韩和欧美一区二区三区| 色狠狠色狠狠综合| 亚洲视频免费在线观看| 成人高清在线视频| 日本一区二区高清| 国产在线日韩欧美| 日韩精品自拍偷拍| 日韩高清一区二区| 欧美精品丝袜中出| 视频在线观看一区二区三区| 欧洲av在线精品| 一级中文字幕一区二区| 在线免费观看日本一区| 一区二区三区四区蜜桃| 91免费精品国自产拍在线不卡 | 欧美国产禁国产网站cc| 国产九色精品成人porny| 久久亚洲精品小早川怜子|