1. 程式人生 > >MySQL索引使用限制

MySQL索引使用限制

MySQL索引使用限制

  • 不要在列上進行運算。 
    select * from users where YEAR(adddate)<2007; 將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成select * from users where adddate<‘2007-01-01’;
  • like語句操作 
    如果使用like。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。 
    select * from users where name like '%aaa%'不會使用索引 
    select * from users where name like 'aaa%'可以使用索引
  • 使用短索引 
    例如,如果有一個CHAR(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。
  • 索引不會包含NULL列 
    複合索引中如果有一列含有NULL值那麼這個組合索引都將失效,一般需要給預設值0或者 ' '字串
  • 最左匹配 
    不按索引最左列開始查詢(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) ,where ‘c2’ = ‘aaa’ 不使用索引,where ‘c2’ = ‘aaa’ and ‘c3’ = ‘sss’ 不能使用索引。where ‘c1’ = ‘aaa’ and ‘c2’ = ‘bbb’ 可以使用索引
  • 多列範圍查詢 
    查詢中某個列有範圍查詢,則其右邊的所有列都無法使用查詢(多列查詢)。where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 該查詢只會使用索引中的前兩列,c3將不能使用到索引,因為like是範圍查詢。
  • 檢索排序 
    一個查詢語句中,既有檢索又有排序並且是不同的欄位,且這兩個列上都有單列索引(獨立索引),那麼只有其中一個列用到索引,因為查詢優化器在做檢索和排序中不能同時使用兩個不同的索引
  • 索引雜湊度 
    通過索引掃描的記錄超過了表總行數的30%(估計值),則查詢優化器認為全表掃描的效率更高,所以會變成全表掃描查詢
  • 隱式轉換 
    隱式轉換導致的索引失效。比如,表的欄位tu_mdn定義為varchar(20),但在查詢時把該欄位作為number型別當做where條件,這樣會導致索引失效. 錯誤的例子:select * from test where tu_mdn=13333333333; 正確的例子:select * from test where tu_mdn='13333333333’;