01、在 where 中使用不到的字段,不要设置索引
where 条件(包括 group by、order by)里用不到的字段不需要创建索引,索引的价值是快速定位,如果起不到定位的字段通常是无需创建索引的。
02、数据量小的表最好不要使用索引
如果表里记录的数据太少,比如少于 1000 个,那么是不需要创建索引的。表记录太少的话,是否创建索引对查询效率的影响是并不大的。甚至说,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
03、有大量重复数据的列上不要建立索引
在条件表达式中,建议给经常用到的不同值较多的列上建立索引,但是字段中如果有大量重复数据,也不用建立索引。
比如:在学生表的 “性别” 字段上只有 <男><女> 两个不同的值,所以无需建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低数据的更新速度。
如果要在 100w 行数据中查找其中的 50w 行(性别为男的数据),一旦创建了索引,就需要先访问 50w 次索引,然后再访问 50w 次数据表,这样加起来的开销比不适用索引可能还要大。
04、避免对经常更新的表创建过多的索引
第一层含义:频繁更新的字段不一定要创建索引。因为更新数据的时候也需要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。
第二层含义:避免对经常更新的表创建过多的索引,并且索引中
的列尽可能少。此时,虽然提高了查询速度,同时却会降低更新表的速度。
05、不建议用无序的值作为索引
例如身份证、UUID(在索引比较时需要转为 ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字符串等。
06、删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引将它们删除,从而减少索引对更新操作的影响。
07、不要定义冗余或重复的索引
① 冗余索引
例如:通过 idx_name_birthday_phone_number 索引就可以对 name 列进行快速搜索,再创建一个专门针对 name 列的索引就算是一个冗余索引,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。
② 重复索引
例如:col1 既是主键、又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就
会生成聚簇索引,所以定义的唯一索引和普通索引是重复的,这种情况要避免。