掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
為了驗證 MySQL 中哪些情況下會導致索引失效,我們可以借助 explain 執(zhí)行計劃來分析索引失效的具體場景。

創(chuàng)新互聯(lián)公司-專業(yè)網站定制、快速模板網站建設、高性價比隴川網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式隴川網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋隴川地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
explain 使用如下,只需要在查詢的 SQL 前面添加上 explain 關鍵字即可,如下圖所示:
而以上查詢結果的列中,我們最主要觀察 key 這一列,key 這一列表示實際使用的索引,如果為 NULL 則表示未使用索引,反之則使用了索引。
以上所有結果列說明如下:
其中最重要的就是 type 字段,type 值類型如下:
為了演示和測試那種情況下會導致索引失效,我們先創(chuàng)建一個測試表和相應的數據:
-- 創(chuàng)建表
drop table if exists student;
create table student(
id int primary key auto_increment comment '主鍵',
sn varchar(32) comment '學號',
name varchar(250) comment '姓名',
age int comment '年齡',
sex bit comment '性別',
address varchar(250) comment '家庭地址',
key idx_address (address),
key idx_sn_name_age (sn,name,age)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 添加測試數據
insert into student(id,sn,name,age,sex,address)
values(1,'cn001','張三',18,1,'高老莊'),
(2,'cn002','李四',20,0,'花果山'),
(3,'cn003','王五',50,1,'水簾洞');
當前表中總共有 3 個索引,如下圖所示:
PS:本文以下內容基于 MySQL 5.7 InnoDB 數據引擎下。
最左匹配原則指的是,以最左邊的為起點字段查詢可以使用聯(lián)合索引,否則將不能使用聯(lián)合索引。我們本文的聯(lián)合索引的字段順序是 sn + name + age,我們假設它們的順序是 A + B + C,以下聯(lián)合索引的使用情況如下:
從上述結果可以看出,如果是以最左邊開始匹配的字段都可以使用上聯(lián)合索引,比如:
其中:A 等于字段 sn,B 等于字段 name,C 等于字段 age。
而 B+C 卻不能使用到聯(lián)合索引,這就是最左匹配原則。
模糊查詢 like 的常見用法有 3 種:
而這 3 種模糊查詢中只有第 1 種查詢方式可以使用到索引,具體執(zhí)行結果如下:
如果索引列使用了運算,那么索引也會失效,如下圖所示:
查詢列如果使用任意 MySQL 提供的函數就會導致索引失效,比如以下列使用了 ifnull 函數之后的執(zhí)行計劃如下:
如果索引列存在類型轉換,那么也不會走索引,比如 address 為字符串類型,而查詢的時候設置了 int 類型的值就會導致索引失效,如下圖所示:
當在查詢中使用了 is not null 也會導致索引失效,而 is null 則會正常觸發(fā)索引的,如下圖所示:
導致 MySQL 索引失效的常見場景有以下 6 種:

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流