尽管索引有提速的功能(可以提高相应的select的效率),但是也不能滥用,因为它会降低数据表的写操作速度(insert和update的效率会变低),也会占用一定的磁盘空间。所以在创建和使用索引的过程中,有一些事项需要注意:

一、何时创建索引。

  • WHERE关键词后面的字段创建索引,可以加快条件判断速度。
  • ORDER BY关键词后面的字段创建索引,可以加快排序速度。
  • 表连接关键词ON后面的字段创建索引,可以加快表连接速度。
  • 包含大量NULL的字段不适合创建索引,因为索引不可以包含NULL值。
  • 包含大量重复值的字段不适合创建索引,因为基于索引的查询规则。在进行条件筛选的时候可能会产生大量的数据行,此时索引并不能加快数据库搜索过程中的扫描速度。

二、索引无效的情况。

  • WHERE关键词后面的条件表达式中如果使用 IN 、 OR 、 != 或者 <> ,均会导致索引无效。解决方法是将 "!=" 或者 "<>" 替换为 ">AND<" ,将 "IS NOT NULL" 替换为 ">=CHR(0)"。 
  • 筛选或排序过程中,如果对索引列使用函数,则索引失效。
  • 筛选过程中,如果字符型字段写成了数值型的数字,则索引失效(比如,用户id是字符型,那筛选的时候要写 WHERE uid = "1" )。
  • 使用模糊查询的时候,如果将通配符放在开头,则索引失效(like "%aaa%" 不会使用索引而 like "aaa%" 可以使用索引)
  • 对于多列的组合索引,遵循左原则,例如对字段A,B,C设置索引 INDEX(A,B,C),则 "A > 0 AND B > 10" , "A > 0 AND B > 10 AND C > 100" , 都可以使组合索引有效,但是 "B > 10" ,"B > 10 AND C > 100" 都会导致组合索引失效。
  • 在 JOIN 操作中,关键词 ON 后面的字段类型要保持(也就是左边中这个字段的数据类型和右表中同一字段的数据类型要保持一致),否则索引无效。

三、索引数量并不是越多越好。

  • 原则上,一个表的索引数量最好不要超过6个(当然也得看你的数据的原始字段数量)。