MySql索引優化

  1. 顯示索引:
    show index from article;
     
  2. 創建索引:
    create index ids_article_ccv on article(category_id,comments,views);
    或者使用另一種方式:
    alter table article add index ids_article_ccv (category_id,comments,views);
     
  3. 刪除索引:

    drop index ids_article_ccv from article;

     

索引失效案例:
 

  1. 全值匹配我最愛:

    索引  idx_staffs_nameAgePos 建立索引時 以 name , age ,pos 的順序建立的。全值匹配表示 按順序匹配的
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;
    EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev';


     
  2. 最佳左前綴法則:  如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始並且不跳過索引中的列。

    and 忽略左右關係。既即使沒有沒有按順序 由於優化器的存在,會自動優化。
    經過試驗結論  建立了 idx_nameAge 索引  id 爲主鍵
        1.當使用覆蓋索引的方式時,(select name/age/id from staffs where age=10 (後面沒有其他沒有索引的字段條件)),即使不是以 name 開頭,也會使用 idx_nameAge 索引。
        既 select 後的字段 有索引,where 後的字段也有索引,則無關執行順序。
        2.除開上述條件 才滿足最左前綴法則。
     
    EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev';
     
    EXPLAIN SELECT * FROM staffs WHERE pos = 'dev';


     
  3. 不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換),會導致索引失效而轉向全表掃描


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

    範圍 若有索引則能使用到索引,範圍條件右邊的索引會失效(範圍條件右邊與範圍條件使用的同一個組合索引,右邊的纔會失效。若是不同索引則不會失效)
  5. 儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select *

  6. mysql 在使用不等於(!= 或者<>)的時候無法使用索引會導致全表掃描

    索引  idx_nameAgeJob
             idx_name
    使用 != 和 <> 的字段索引失效( != 針對數值類型。 <> 針對字符類型
    前提 where and 後的字段在混合索引中的位置比比當前字段靠後  where age != 10 and name='xxx'  ,這種情況下,mysql自動優化,將 name='xxx' 放在 age !=10 之前,name 依然能使用索引。只是 age 的索引失效)


     
  7. is not null 也無法使用索引,但是is null是可以使用索引的

     
  8. like以通配符開頭('%abc...')mysql索引失效會變成全表掃描的操作
     like ‘%abc%’  type 類型會變成 all
    like ‘abc%’ type 類型爲 range ,算是範圍,可以使用索引


     
  9. 字符串不加單引號索引失效
     
  10. 少用or,用它來連接時會索引失效

     
  11. 總結:

 

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