婷婷综合国产,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网页版在线| 欧美日韩久久不卡| 亚洲超碰精品一区二区| 日韩一级成人av| 91麻豆成人久久精品二区三区| 欧美精品aⅴ在线视频| 91影院在线观看| caoporn国产一区二区| 香蕉加勒比综合久久| 亚洲伦理在线精品| 国产日韩三级在线| 精品88久久久久88久久久| 日韩一区和二区| 日韩精品在线网站| 日韩欧美区一区二| 日本一区二区成人在线| 亚洲欧洲韩国日本视频| 亚洲免费电影在线| 中文一区二区在线观看| 欧美激情一区二区三区不卡| 综合色中文字幕| 日韩精品福利网| 91美女片黄在线观看91美女| 久久精品72免费观看| 盗摄精品av一区二区三区| 亚洲美女电影在线| 蜜芽一区二区三区| 老司机一区二区| 成人网在线免费视频| 在线观看网站黄不卡| 3d成人h动漫网站入口| 精品国产亚洲在线| 亚洲三级在线免费观看| 久久国产精品99久久人人澡| 国产白丝精品91爽爽久久| 99riav一区二区三区| 精品在线免费观看| 水野朝阳av一区二区三区| 欧美国产一区二区在线观看 | 一区二区高清在线| 国产在线精品一区二区| 91精品国产91久久久久久一区二区| 日韩一级片在线播放| 国产精品久久精品日日| 风间由美一区二区av101| 制服丝袜日韩国产| 丝袜亚洲另类丝袜在线| 欧美日韩一区二区三区不卡| 中文字幕在线不卡视频| 国产成人在线视频网站| 精品成人免费观看| 国产精品亚洲专一区二区三区| 欧美性色黄大片| 日本中文字幕一区二区视频| 欧美在线观看你懂的| 亚洲一区二区三区四区中文字幕| 国产成人综合在线| www.99精品| 欧美日韩中文一区| 26uuu亚洲| 一区二区三区毛片| 日本成人在线看| 大桥未久av一区二区三区中文| 国产精品一区二区免费不卡| 91香蕉视频污在线| 欧美一区二区三区在线观看| 精品三级在线观看| 亚洲综合免费观看高清完整版在线| 亚洲欧美另类久久久精品 | 日本色综合中文字幕| 久久91精品国产91久久小草| 成人av网址在线观看| 欧美视频一区二| 久久久久亚洲综合| 青青草伊人久久| 北条麻妃国产九九精品视频| 欧美日韩国产综合草草| 亚洲国产精品高清| 国产老女人精品毛片久久| 91蝌蚪porny成人天涯| 欧美国产日韩亚洲一区| 韩国欧美国产一区| 精品国产伦一区二区三区观看体验| 日本一区二区三区四区| 韩国v欧美v亚洲v日本v| 日韩视频免费观看高清完整版| 亚洲男人电影天堂| 99re成人在线| 亚洲欧洲综合另类| 91欧美激情一区二区三区成人| 亚洲精品一区二区三区影院| 久久国产麻豆精品| 久久综合色鬼综合色| 久久精品国产99国产| 精品成人一区二区三区| 国产成人av自拍| 亚洲视频资源在线| 日本韩国一区二区三区| 亚洲国产aⅴ成人精品无吗| 欧美日韩精品电影| 日韩高清不卡一区二区三区| 欧美精品自拍偷拍| 国产激情视频一区二区三区欧美 | 久久久99精品久久| 亚洲免费av网站| 7777精品久久久大香线蕉| 久久se精品一区精品二区| 欧美国产精品一区| 欧美精品三级日韩久久| 国产精品91xxx| 婷婷国产在线综合| 亚洲欧洲精品一区二区精品久久久 | 五月婷婷激情综合| 91精品午夜视频| 成人h动漫精品一区二| 亚洲午夜电影在线观看| 欧美一区二区成人6969| 99久久精品国产观看| 日韩av在线播放中文字幕| 久久久精品欧美丰满| 欧美午夜精品一区二区蜜桃| 免费黄网站欧美| 午夜视频在线观看一区| 中文字幕一区二区三区在线不卡| 大尺度一区二区| 日本一道高清亚洲日美韩| 中文字幕在线一区二区三区| 欧美成人精品3d动漫h| 色乱码一区二区三区88| 成人av网站在线观看免费| 激情五月激情综合网| 国产色综合一区| 国产农村妇女毛片精品久久麻豆| 色哟哟日韩精品| 欧美日韩国产欧美日美国产精品| 亚洲国产sm捆绑调教视频| 国产精品高潮呻吟| 1区2区3区国产精品| 一区二区三区四区激情| 午夜国产精品影院在线观看| 图片区小说区国产精品视频| 丝袜美腿高跟呻吟高潮一区| 亚洲aⅴ怡春院| 日本大胆欧美人术艺术动态| 日精品一区二区三区| 久久精品国产一区二区三| 国产一区 二区 三区一级| 奇米色777欧美一区二区| 夜夜爽夜夜爽精品视频| 午夜精品福利一区二区三区av| 三级不卡在线观看| 免费观看在线色综合| 九九在线精品视频| 国产成人av电影在线播放| 国产成a人亚洲精品| 色欧美乱欧美15图片| 欧美一区二区三区喷汁尤物| 日韩精品一区二区三区四区| 精品1区2区在线观看| 香蕉影视欧美成人| 国产精品影视网| 欧美午夜一区二区三区免费大片| 欧美精品九九99久久| 国产色综合一区| 日本aⅴ免费视频一区二区三区| 日韩1区2区3区| 91无套直看片红桃| 久久久久久久免费视频了| 亚洲一卡二卡三卡四卡 | 一区在线观看视频| 亚洲美女视频在线观看| 国产成人一区在线| 欧美成人一区二区三区片免费 | 日韩av在线播放中文字幕| 99久久精品国产观看| 久久久99久久精品欧美| 久久www免费人成看片高清| 97久久超碰国产精品电影| 久久久久久久久伊人| 国产乱妇无码大片在线观看| 欧美丰满一区二区免费视频| 一区二区在线观看视频在线观看| 国产一二三精品| 国产欧美综合在线观看第十页| 美女在线视频一区| 欧美一卡二卡在线观看| 国内偷窥港台综合视频在线播放| 欧美大尺度电影在线| 国模冰冰炮一区二区| 国产中文一区二区三区| 色综合中文字幕| 日韩精品一级中文字幕精品视频免费观看 | 久久久久久久综合| 亚洲精品免费在线播放| 蜜臀久久久久久久| 色一区在线观看| 91精品久久久久久久91蜜桃| 亚洲人成在线观看一区二区| 成人免费视频免费观看| 欧美精品一区二区在线观看|