explain分析後的情況解析:
一、哪些列上不適合創建索引?
在dept表中添加上索引
//添加主鍵索引
alter table dept add primary key(deptno);
//創建複合索引,dname是左邊列,loc是右邊列
create index my_index on dept(dname,loc);
1. 在較爲頻繁的作爲查詢條件的字段應該創建索引。比如:
select * from emp where empno = 123456
2. 唯一性太差的字段不適合創建單獨的索引,及時頻繁作爲查詢條件。 比如:
select * from user where sex = '男'
3. 更新非常頻繁的字段不適合創建索引
select * from emp where logincount=1;//登錄的次數
4. 不會出現在where字句中的字段不適合創建索引、
二、滿足一下條件的可以創建索引
1. 在where字句中作爲查詢條件經常出現的
2. 字段內容多樣的,不能如性別,只分:男和女
3. 字段內容不能頻繁更新的
三、下面幾種情況有可能使用到索引
1. 對於創建的多列索引,只要查詢條件使用了最左邊的列,這個索引一般就會使用,最左前綴原則
2. 對於使用like的查詢,如果是 like %aaa%與like %aaa,是不會使用索引的,而 like aaa%會使用到索引
四、下面的幾種情況將不會使用索引
1. 如果條件中有or,即使其中有一方條件帶索引也不會使用索引,除非是or兩邊的條件字段都有索引,但是建議儘量避免使用or
比如:
explain select * from dept where dname='aaa' or loc='ccc'\G
因爲loc處於索引右邊的位置,它沒有使用索引,所以這條sql沒有使用索引,
如果換成deptno字段就可使用索引,因爲deptno字段之前有添加上主鍵索引
explain select * from dept where dname='aaa' or deptno= 235\G
2. 對於多列索引,不是使用的第一部分,則不會使用索引,比如:
//此sql不會用到索引
select * from dept where loc='aaaa';
分析得到:
explain select * from dept where loc='aaaa'\G
3. like查詢中以 % 或 _ 開頭的查詢,都不會使用索引
4. 如果列類型是字符串,一定要將數據在條件中使用引號引用起來,否則不會使用索引(比如:添加時,字符串必須'')
5. 如果Mysql發現使用全表掃描要比索引快,則不會使用索引。
五、查看索引的使用率
show status like 'handler_read%';
Handler_read_rnd_next爲109是因爲我們在建索引之前,已經查詢過sql語句,如果先建索引,在查sql語句,這個值會更低