MySQL復合索引中七種常見的索引失效情形

2021-10-10 15:20:47 字數 3036 閱讀 1427

#資料庫說明

使用的table emp如下:

create table emp(

id int(11) not null auto_increment,

empno int not null,

name varchar(20) default null,

age int(3) default null,

deptid int(11) default null,

primary key (id)

)engine = innodb auto_increment=1 default charset =utf8;

然後在其中隨機插入500000條資料

嘗試建立age_name_deptid順序的復合索引,並查詢執**況

create index idx_age_name_deptid on emp(age, name, deptid);

explain select sql_no_cache * from emp where emp.`age`=30

and emp.name='abcd'

and emp.`deptid`=4;

結果如下:

以上為索引正常使用情況,可以看到在使用索引後,物理行由500000減少到1,提高了效率。下面以此為基礎介紹七種索引失效情形

1. 情形1 第乙個位置缺少查詢項

create index idx_age_name_deptid on emp(age, name, deptid);

explain select sql_no_cache * from emp where emp.name='abcd' and emp.`deptid`=4;

結果如下:

物理行rows接近500000,可見查詢結果為全表查詢

2. 情形2 索引中斷,則中斷後面部分的索引無效

explain select sql_no_cache * from emp where emp.age=30 and emp.`deptid`=4;
結果如下:

可見,雖然查詢的物理行下降到4萬多,但比全表掃瞄效率高,但比最佳情況要差。這是因為已建立的索引順序為age_name_deptid,而這個查詢為age_deptid,在name處中斷了,中斷後的索引失效。

3. 情形3 在索引列上使用函式

create index idx_name on emp(name);

explain select sql_no_cache * from emp where emp.`name` like 'abc%';

explain select sql_no_cache * from emp where left(emp.`name`,3) = 'abc';

第一條查詢結果

第二條查詢結果

4. 情形4 儲存引擎不能使用索引中範圍條件右邊的列**

explain select sql_no_cache * from emp where emp.age=30 and emp.`deptid`=4 and emp.name='abcd';

explain select sql_no_cache * from emp where emp.age=30 and emp.`deptid`>=4 and emp.name='abcd';

5. 情形5 出現不等於時不能使用索引

explain select sql_no_cache * from emp where  emp.`deptid`=4;

create index idx_deptid on emp(deptid);

explain select sql_no_cache * from emp where emp.`deptid`=4;

explain select sql_no_cache * from emp where emp.`deptid`<>4;

結果如下:

*6. 情形6 is not null無法使用索引,但is null可以使用索引

explain select sql_no_cache * from emp where age is null;

explain select sql_no_cache * from emp where age is not null;

7. 情形7 like『%***』時索引失效*

explain select sql_no_cache * from emp where name like 'abc';

explain select sql_no_cache * from emp where name like 'abc%';

explain select sql_no_cache * from emp where name like '%abc';

Mysql中七種常見索引訪問型別

在少量資料的情況下,資料庫有無索引,select語句是否走索引並不影響查詢效率 但是在現實世界中,資料是十分龐大的,這時候資料庫有索引和select語句走索引對查詢效率可能會有幾十倍,幾百倍甚至更多倍的提高!因此我們在寫select語句時一定要通過explain的type來分析索引的訪問型別,下面介...

常見的七種排序

排序演算法大體可分為兩類 非線性時間比較類排序 交換類排序 快速排序和氣泡排序 插入類排序 簡單插入排序和希爾排序 選擇類排序 簡單選擇排序和堆排序 歸併排序 二路歸併排序和多路歸併排序 線性時間非比較類排序 計數排序,桶排序,和基數排序 氣泡排序 重複地走訪過要排序的元素列,依次比較兩個相鄰的元素...

常見的七種回歸技術

根據受歡迎程度,線性回歸和邏輯回歸經常是我們做 模型時,且第乙個學習的演算法。但是如果認為回歸就兩個演算法,就大錯特錯了。事實上我們有許多態別的回歸方法可以去建模。每乙個演算法都有其重要性和特殊性。什麼是回歸分析?我們為什麼要使用回歸分析?回歸有哪些型別 如何去選擇回歸模型?回歸分析是研究自變數和因...