#資料庫說明
使用的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來分析索引的訪問型別,下面介...
常見的七種排序
排序演算法大體可分為兩類 非線性時間比較類排序 交換類排序 快速排序和氣泡排序 插入類排序 簡單插入排序和希爾排序 選擇類排序 簡單選擇排序和堆排序 歸併排序 二路歸併排序和多路歸併排序 線性時間非比較類排序 計數排序,桶排序,和基數排序 氣泡排序 重複地走訪過要排序的元素列,依次比較兩個相鄰的元素...
常見的七種回歸技術
根據受歡迎程度,線性回歸和邏輯回歸經常是我們做 模型時,且第乙個學習的演算法。但是如果認為回歸就兩個演算法,就大錯特錯了。事實上我們有許多態別的回歸方法可以去建模。每乙個演算法都有其重要性和特殊性。什麼是回歸分析?我們為什麼要使用回歸分析?回歸有哪些型別 如何去選擇回歸模型?回歸分析是研究自變數和因...