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

主頁 > 知識庫 > mysql索引失效的十大問題小結

mysql索引失效的十大問題小結

熱門標簽:外東北地圖標注 拉卡拉外呼系統 智能外呼系統復位 400電話可以辦理嗎 話務外呼系統怎么樣 高清地圖標注道路 大眾點評星級酒店地圖標注 臨清電話機器人 云南電商智能外呼系統價格

背景

最近生產爆出一條慢sql,原因是用了or和!=,導致索引失效。于是,總結了索引失效的十大雜癥,希望對大家有幫助,加油。

一、查詢條件包含or,可能導致索引失效

新建一個user表,它有一個普通索引userId,結構如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `age` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

執行一條查詢sql,它是會走索引的,如下圖所示:

把or條件+沒有索引的age加上,并不會走索引,如圖:

分析結論:

  • 對于or+沒有索引的age這種情況,假設它走了userId的索引,但是走到age查詢條件時,它還得全表掃描,也就是需要三步過程: 全表掃描+索引掃描+合并
  • 如果它一開始就走全表掃描,直接一遍掃描就完事。
  • mysql是有優化器的,處于效率與成本,遇到or條件,索引可能失效,看起來也合情合理。

注意: 如果or條件的列都加了索引,索引可能會走的,大家可以自己試一試。

二、如何字段類型是字符串,where時一定用引號括起來,否則索引失效

假設demo表結構如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` varchar(32) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

userId為字符串類型,是B+樹的普通索引,如果查詢條件傳了一個數字過去,它是不走索引的,如圖所示:

如果給數字加上'',也就是傳一個字符串呢,當然是走索引,如下圖: 

分析與結論:

為什么第一條語句未加單引號就不走索引了呢? 這是因為不加單引號時,是字符串跟數字的比較,它們類型不匹配,MySQL會做隱式的類型轉換,把它們轉換為浮點數再做比較。

三、like通配符可能導致索引失效。

并不是用了like通配符,索引一定失效,而是like查詢是以%開頭,才會導致索引失效。

表結構:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` varchar(32) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

like查詢以%開頭,索引失效,如圖:

把%放后面,發現索引還是正常走的,如下:

把%加回來,改為只查索引的字段(覆蓋索引),發現還是走索引,驚不驚喜,意不意外

結論:

like查詢以%開頭,會導致索引失效。可以有兩種方式優化:

  • 使用覆蓋索引
  • 把%放后面

附: 索引包含所有滿足查詢需要的數據的索引,稱為覆蓋索引(Covering Index)。

四、聯合索引,查詢時的條件列不是聯合索引中的第一個列,索引失效。

表結構:(有一個聯合索引idx_userid_ageuserId在前,age在后)

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userid_age` (`userId`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

在聯合索引中,查詢條件滿足最左匹配原則時,索引是正常生效的。請看demo:

如果條件列不是聯合索引中的第一個列,索引失效,如下:

分析與結論:

  • 當我們創建一個聯合索引的時候,如(k1,k2,k3),相當于創建了(k1)、(k1,k2)和(k1,k2,k3)三個索引,這就是最左匹配原則。
  • 聯合索引不滿足最左原則,索引一般會失效,但是這個還跟Mysql優化器有關的。

五、在索引列上使用mysql的內置函數,索引失效。

表結構:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` varchar(32) NOT NULL,
  `loginTime` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`) USING BTREE,
  KEY `idx_login_time` (`loginTime`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

雖然loginTime加了索引,但是因為使用了mysql的內置函數Date_ADD(),索引直接GG,如圖:

六、對索引列運算(如,+、-、*、/),索引失效。

表結構:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` varchar(32) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

雖然age加了索引,但是因為它進行運算,索引直接迷路了。。。 如圖:

七、索引字段上使用(!= 或者 >,not in)時,可能會導致索引失效。

表結構:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

雖然age加了索引,但是使用了!= 或者 >,not in這些時,索引如同虛設。如下: 

八、索引字段上使用is null, is not null,可能導致索引失效。

表結構:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `card` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE,
  KEY `idx_card` (`card`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

單個name字段加上索引,并查詢name為非空的語句,其實會走索引的,如下:

單個card字段加上索引,并查詢name為非空的語句,其實會走索引的,如下:

但是它兩用or連接起來,索引就失效了,如下:

九、左連接查詢或者右連接查詢查詢關聯的字段編碼格式不一樣,可能導致索引失效。

新建兩個表,一個user,一個user_job

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
CREATE TABLE `user_job` (
  `id` int(11) NOT NULL,
  `userId` int(11) NOT NULL,
  `job` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

user 表的name字段編碼是utf8mb4,而user_job表的name字段編碼為utf8。 

執行左外連接查詢,user_job表還是走全表掃描,如下:

如果把它們改為name字段編碼一致,還是會走索引。

十、mysql估計使用全表掃描要比使用索引快,則不使用索引。

  • 當表的索引被查詢,會使用最好的索引,除非優化器使用全表掃描更有效。優化器優化成全表掃描取決與使用最好索引查出來的數據是否超過表的30%的數據。
  • 不要給'性別'等增加索引。如果某個數據列里包含了均是"0/1"或“Y/N”等值,即包含著許多重復的值,就算為它建立了索引,索引效果不會太好,還可能導致全表掃描。

Mysql出于效率與成本考慮,估算全表掃描與使用索引,哪個執行快。這跟它的優化器有關,來看一下它的邏輯架構圖吧(圖片來源網上) 

總結

總結了索引失效的十大雜癥,在這里來個首尾呼應吧,分析一下我們生產的那條慢sql。 模擬的表結構與肇事sql如下:

CREATE TABLE `user_session` (
  `user_id` varchar(32) CHARACTER SET utf8mb4 NOT NULL,
  `device_id` varchar(64) NOT NULL,
  `status` varchar(2) NOT NULL,
  `create_time` datetime NOT NULL,
  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`device_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
explain 
update user_session set status =1
where  (`user_id` = '1' and `device_id`!='2')
or (`user_id` != '1' and `device_id`='2')

分析:

  • 執行的sql,使用了or條件,因為組合主鍵(user_id,device_id),看起來像是每一列都加了索引,索引會生效。
  • 但是出現!=,可能導致索引失效。也就是or+!=兩大綜合癥,導致了慢更新sql。

解決方案:

那么,怎么解決呢?我們是把or條件拆掉,分成兩條執行。同時給device_id加一個普通索引。

最后,總結了索引失效的十大雜癥,希望大家在工作學習中,參考這十大雜癥,多點結合執行計劃expain和場景,具體分析 ,而不是按部就班,墨守成規,認定哪個情景一定索引失效。

到此這篇關于mysql索引失效的十大問題的文章就介紹到這了,更多相關mysql索引失效的十大問題內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • mysql回表致索引失效案例講解
  • 解決mysql模糊查詢索引失效問題的幾種方法
  • MySQL索引失效的典型案例
  • mysql索引失效的幾種情況分析
  • MySQL索引失效的幾種情況詳析
  • MySQL索引失效的幾種情況匯總
  • mysql索引失效的五種情況分析
  • Mysql索引會失效的幾種情況分析

標簽:阿里 定西 福州 三明 溫州 揚州 山西 無錫

巨人網絡通訊聲明:本文標題《mysql索引失效的十大問題小結》,本文關鍵詞  mysql,索引,失效,的,十,大問題,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《mysql索引失效的十大問題小結》相關的同類信息!
  • 本頁收集關于mysql索引失效的十大問題小結的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91美女在线观看| 激情文学综合网| 国内精品嫩模私拍在线| 成人理论电影网| 日本女人一区二区三区| 精品亚洲aⅴ乱码一区二区三区| 91精品久久久久久久91蜜桃| 亚洲va天堂va国产va久| 亚洲一区在线观看免费观看电影高清 | 欧美另类高清zo欧美| 日韩一级片网站| 色综合亚洲欧洲| 国产一区二区三区在线观看免费| 日本一区二区不卡视频| 国产精品久久免费看| 日韩欧美视频一区| 日本道色综合久久| 欧美午夜精品久久久久久超碰 | 亚洲精品五月天| 欧美成人vps| 精品对白一区国产伦| 天天操天天色综合| 亚洲成人资源在线| 国产精品网站导航| 亚洲成a天堂v人片| 色激情天天射综合网| 亚洲视频在线观看三级| 日本乱码高清不卡字幕| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲国产欧美另类丝袜| 婷婷成人综合网| 亚洲精品成人天堂一二三| 欧美电视剧在线看免费| 热久久久久久久| 天天影视涩香欲综合网| 美女视频黄 久久| 欧美曰成人黄网| 麻豆久久久久久久| 精品国产免费一区二区三区四区 | 91丨九色丨蝌蚪富婆spa| 日韩三区在线观看| 免费成人美女在线观看.| 国产精品免费视频网站| 精品一区二区三区免费毛片爱 | 欧美一级二级在线观看| 亚洲宅男天堂在线观看无病毒| 久久www免费人成看片高清| 国产精品一二三区| 欧美大片免费久久精品三p| 欧美日韩一区中文字幕| a在线欧美一区| 亚洲一卡二卡三卡四卡无卡久久| 九九九精品视频| 国产欧美一区二区三区鸳鸯浴 | 国产精品白丝jk黑袜喷水| 久久se精品一区二区| 欧美丰满嫩嫩电影| 色综合咪咪久久| 欧美大片在线观看一区二区| 欧美日韩一区高清| 日韩高清不卡在线| 欧美在线啊v一区| 青青草伊人久久| 成人久久18免费网站麻豆| 精品国产乱子伦一区| 成人aa视频在线观看| 日韩一区二区免费在线观看| 欧美日韩一区高清| 久久国产精品色| 99精品黄色片免费大全| 日韩精品亚洲一区| √…a在线天堂一区| 一道本成人在线| 日韩一区二区三区三四区视频在线观看 | 亚洲午夜久久久久| 韩国av一区二区| 国产成人在线网站| 亚洲成人午夜影院| 国产网站一区二区三区| 国产成人av电影在线播放| 欧美精品免费视频| 日韩一区欧美小说| 在线看国产一区二区| 精品视频一区 二区 三区| 99国产一区二区三精品乱码| 成人自拍视频在线| 国产一区二区毛片| 2017欧美狠狠色| 中文字幕乱码日本亚洲一区二区| 日本欧美一区二区三区乱码| 久久爱www久久做| 日韩电影免费在线看| 欧美性高清videossexo| 一区二区三区日韩在线观看| 欧美丝袜自拍制服另类| 91精品福利在线一区二区三区 | 日韩一区二区三区视频在线| 亚洲国产日韩在线一区模特| 亚洲国产精品欧美一二99| 樱桃国产成人精品视频| 国产亚洲精品中文字幕| 91蜜桃在线观看| 91成人国产精品| 成人黄色大片在线观看| 色偷偷久久一区二区三区| 久久午夜色播影院免费高清| 欧美精品一区二区不卡| 国产欧美日韩视频一区二区| 91豆麻精品91久久久久久| 日韩一级免费一区| 欧美三级在线视频| 久久精品人人做人人爽人人| 欧美在线免费观看亚洲| 亚洲精品videosex极品| 国产精品久久三| 亚洲综合久久久| 国产精品1区2区| 日本女人一区二区三区| 一区二区三区在线视频观看| 丝袜美腿亚洲综合| 亚洲日本在线视频观看| 欧美韩国日本一区| 欧美亚洲尤物久久| 91精品国产福利在线观看| 成人做爰69片免费看网站| 中文字幕色av一区二区三区| 精品久久人人做人人爽| 亚洲成人自拍一区| 欧美无砖砖区免费| 亚洲国产日韩a在线播放性色| 亚洲人成影院在线观看| 久久精品国产澳门| 欧美视频三区在线播放| 久久免费美女视频| 久久精品国产亚洲a| 久久综合久久鬼色| 一区二区在线电影| 91福利在线看| 亚洲日本在线a| 欧美网站一区二区| www.色精品| 韩国理伦片一区二区三区在线播放 | 国产伦精品一区二区三区视频青涩 | 日韩国产高清在线| 老司机免费视频一区二区| 成a人片亚洲日本久久| 亚洲精品老司机| 中文字幕免费观看一区| 欧美一二三四在线| 久久综合色之久久综合| 亚洲午夜激情av| 日韩精品一区二区三区三区免费| 狠狠狠色丁香婷婷综合激情| 亚洲综合男人的天堂| 国产日韩综合av| 最近中文字幕一区二区三区| 日韩久久久精品| 精品国产污污免费网站入口 | 午夜精品123| 成人h动漫精品一区二| 国产麻豆精品95视频| 欧美日韩国产系列| 精品免费视频.| 成人丝袜18视频在线观看| av在线播放不卡| 九九热在线视频观看这里只有精品| 在线日韩一区二区| 4438成人网| 国产视频一区二区在线观看| 男女视频一区二区| 亚洲欧美韩国综合色| 亚洲二区视频在线| 欧美精品 日韩| 在线观看成人小视频| 国产精品1024| 国产成人8x视频一区二区| 成人app在线| 午夜不卡av免费| 日韩欧美自拍偷拍| 亚洲女性喷水在线观看一区| 久久99久久99小草精品免视看| 国产麻豆精品久久一二三| 国产精品视频一二三| 91精品国产91热久久久做人人| 亚洲日本护士毛茸茸| 国模大尺度一区二区三区| 久久综合999| 国产成人在线看| 国产精品国产自产拍高清av| 一区二区三区在线视频免费观看 | 国产日韩综合av| 成人免费在线观看入口| 久久婷婷综合激情| 国产午夜精品一区二区三区嫩草 | 不卡视频在线看| 欧美喷潮久久久xxxxx| 国产成人精品免费视频网站| 欧美精品久久一区二区三区| 欧美另类高清zo欧美| 不卡高清视频专区|