建立索引後,速度變快原因?以及索引失效總結

wanghaitao4j發表於2018-10-11

總結自韓順平老師教學

速度變快是因為搜尋引擎的選擇,一般是Btree,二叉樹的話是logn的時間複雜度;

索引失效的總結。以下是具體描述。

原理示意圖:

 

.

 

索引使用的注意事項

索引的代價:

  1. 佔用磁碟空間
  2. 對dml操作有影響,變慢
    1. 在哪些列上適合新增索引?

 

總結: 滿足以下條件的欄位,才應該建立索引.

a: 肯定在where條經常使用 b: 該欄位的內容不是唯一的幾個值(sex) c: 欄位內容不是頻繁變化.

 

索引失效的注意事項

(很多都是最左原則)

把dept表中,我增加幾個部門:

alter table dept add index my_ind (dname,loc); //  dname 左邊的列,loc就是右邊的列

 

說明,如果我們的表中有複合索引(索引作用在多列上), 此時我們注意:

  1. 對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用

 

explain select * from dept where loc='aaa'\G

就不會使用到索引

 

2,對於使用like的查詢,查詢如果是  %aaa 不會使用到索引

       ‘aaa%’ 會使用到索引。

 

比如: explain select * from dept where dname like '%aaa'\G

不能使用索引,即,在like查詢時,關鍵的 ‘關鍵字’ , 最前面,不能使用 % 或者 _這樣的字元., 如果一定要前面有變化的值,則考慮使用 全文索引->sphinx.

 

3,如果條件中有or,即使其中有條件帶索引也不會使用。換言之,就是要求使用的所有欄位,都必須建立索引, 我們建議大家儘量避免使用or 關鍵字

 

select * from dept where dname=’xxx’ or loc=’xx’ or deptno=45

 

4,如果列型別是字串,那一定要在條件中將資料使用引號引用起來。否則不使用索引。(新增時,字串必須’’), 也就是,如果列是字串型別,就一定要用 ‘’ 把他包括起來.

 

如果mysql估計使用全表掃描要比使用索引快,則不使用索引。

explain 可以幫助我們在不真正執行某個sql語句時,就執行mysql怎樣執行,這樣利用我們去分析sql指令.

相關文章