MySQL優化--------索引(2)-------索引的使用

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語句,這個值會更低 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章