MySQL索引失效總結(jié)

本文通過不同索引砾脑,不同場(chǎng)景下幼驶,展示了導(dǎo)致索引失效的SQL,幫助大家以后更有效的使用索引查詢拦止。

一县遣、準(zhǔn)備工作

  • 創(chuàng)建一張表 t_index ,腳本如下:
CREATE TABLE `t_index` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '表記錄標(biāo)識(shí)號(hào)汹族,數(shù)據(jù)庫(kù)主鍵萧求,不用于實(shí)際業(yè)務(wù)',
  `key1` varchar(32) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '字段1',
  `key2` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '字段2',
  `key3` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '字段3',
  `del_flag` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '刪除標(biāo)志。0未刪除顶瞒,1刪除夸政。',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記錄創(chuàng)建時(shí)間',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '記錄修改時(shí)間',
  PRIMARY KEY (`id`),
  KEY `idx_create_time` (`create_time`),
  KEY `idx_update_time` (`update_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='索引表';

二、普通索引

1.準(zhǔn)備工作

  • 在字段 key1 上創(chuàng)建索引榴徐,腳本如下:
ALTER TABLE `t_index` ADD INDEX idx_key1(key1);

2.正常走索引情況

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 = '1';
  • 查看執(zhí)行計(jì)劃
EXPLAIN SELECT * FROM `t_index` WHERE key1 = '1';
  • 結(jié)果顯示走索引查詢守问,如下圖


3.如下場(chǎng)景會(huì)導(dǎo)致查詢走全表查詢匀归,不走索引

(1)查詢條件使用不等式

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 <> '1';
  • 查看執(zhí)行計(jì)劃,結(jié)果顯示全表掃描耗帕,如下圖


  • 總結(jié):不等式 <>!= 會(huì)導(dǎo)致索引失效

(2)查詢條件類型不一致

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 = 1;
  • 查看執(zhí)行計(jì)劃穆端,結(jié)果顯示全表掃描,如下圖


  • 總結(jié):字段 key1 為字符串仿便,傳入的值為數(shù)字類型体啰,會(huì)導(dǎo)致索引失效

(3)查詢條件使用函數(shù)計(jì)算

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 + 1 = 1;
SELECT * FROM `t_index` WHERE CHAR_LENGTH(key1) = 1;
  • 查看執(zhí)行計(jì)劃,結(jié)果顯示全表掃描嗽仪,如下圖


  • 總結(jié):查詢條件包含 x+1 荒勇、 x-1CHAR_LENGTH(x) 等函數(shù)會(huì)導(dǎo)致索引失效

(4)模糊查詢

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 LIKE  '3';
SELECT * FROM `t_index` WHERE key1 LIKE  '%3';
SELECT * FROM `t_index` WHERE key1 LIKE  '3%';
  • 查看執(zhí)行計(jì)劃闻坚,如下圖




  • 總結(jié):模糊查詢查詢條件下沽翔,只有全匹配和前綴匹配的模糊查詢才會(huì)走索引(也就是上面的第一、三個(gè)腳本會(huì)走索引)

三窿凤、復(fù)合索引

1.準(zhǔn)備工作

  • 刪除剛才的索引仅偎,在字段 key1, key2, key3 上創(chuàng)建復(fù)合索引,腳本如下:
DROP INDEX idx_key1 ON `t_index`;
ALTER TABLE `t_index` ADD INDEX idx_key123(key1, key2, key3);

2.正常情況

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = '2' AND key3 = '3';
  • 查看執(zhí)行計(jì)劃
EXPLAIN SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = '2' AND key3 = '3';
  • 結(jié)果顯示走索引查詢卷玉,如下圖


3.如下場(chǎng)景會(huì)導(dǎo)致查詢走全表查詢哨颂,不走索引

(1)查詢條件使用不等式

  • 查詢腳本,只要有一個(gè)條件含有不等式相种,都不會(huì)走索引
SELECT * FROM `t_index` WHERE key1 <> '1' AND key2 = '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 <> '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = '2' AND key3 <> '3';
  • 查看執(zhí)行計(jì)劃,結(jié)果顯示全表掃描品姓,三種情況結(jié)果一樣寝并,如下圖


  • 總結(jié):邏輯普通索引

(2)查詢條件類型不一致

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 = 1 AND key2 = '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = 2 AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = '2' AND key3 = 3;
  • 查看執(zhí)行計(jì)劃,結(jié)果顯示(第一個(gè)參數(shù)類型不一致走全表掃描腹备,第二個(gè)參數(shù)類型不一致衬潦,索引僅僅能使用第一列,第三個(gè)參數(shù)類型不一致植酥,索引能使用前兩列)镀岛,如下圖




  • 總結(jié):從第一個(gè)查詢條件開始,第N個(gè)參數(shù)類型不一致友驮,索引能使用前N-1列

(3)查詢條件使用函數(shù)計(jì)算

  • 查詢腳本
SELECT * FROM `t_index` WHERE key1 + 1 = '1' AND key2 = '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 + 1 = '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key1 = '1' AND key2 = '2' AND key3 + 1 = '3';
  • 查看執(zhí)行計(jì)劃漂羊,結(jié)果同上(第一個(gè)參數(shù)類型不一致走全表掃描,第二個(gè)參數(shù)類型不一致卸留,索引僅僅能使用第一列走越,第三個(gè)參數(shù)類型不一致,索引能使用前兩列)耻瑟,如下圖




  • 總結(jié):邏輯普通索引

(4)不使用索引首列當(dāng)查詢條件

  • 查詢腳本
SELECT * FROM `t_index` WHERE key2 = '2' AND key3 = '3';
SELECT * FROM `t_index` WHERE key2 = '2';
SELECT * FROM `t_index` WHERE key3 = '3';
  • 查看執(zhí)行計(jì)劃旨指,結(jié)果顯示(都不會(huì)走索引)赏酥,三種情況結(jié)果一樣,如下圖


  • 總結(jié):查詢條件不使用復(fù)合索引的首列谆构,均會(huì)導(dǎo)致索引失效


本文完裸扶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搬素,隨后出現(xiàn)的幾起案子姓言,更是在濱河造成了極大的恐慌,老刑警劉巖蔗蹋,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何荚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猪杭,警方通過查閱死者的電腦和手機(jī)餐塘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皂吮,“玉大人戒傻,你說我怎么就攤上這事》涑铮” “怎么了需纳?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艺挪。 經(jīng)常有香客問我不翩,道長(zhǎng),這世上最難降的妖魔是什么麻裳? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任口蝠,我火速辦了婚禮,結(jié)果婚禮上津坑,老公的妹妹穿的比我還像新娘妙蔗。我一直安慰自己,他們只是感情好疆瑰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布眉反。 她就那樣靜靜地躺著,像睡著了一般穆役。 火紅的嫁衣襯著肌膚如雪寸五。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天孵睬,我揣著相機(jī)與錄音播歼,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秘狞,可吹牛的內(nèi)容都是我干的叭莫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烁试,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雇初!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起减响,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤靖诗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后支示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刊橘,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年颂鸿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了促绵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘴纺,死狀恐怖败晴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栽渴,我是刑警寧澤尖坤,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站闲擦,受9級(jí)特大地震影響慢味,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佛致,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一贮缕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俺榆,春花似錦、人聲如沸装哆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜕琴。三九已至萍桌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凌简,已是汗流浹背上炎。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藕施。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓寇损,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裳食。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矛市,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355