MySQL八股之数据库索引优化:7个关键注意事项
1、在WHERE中使用不到的字段,不设置索引
WHERE条件,包括ORDER BY和GROUP BY里使用不到的字段不需要设置索引,因为索引的价值是快速定位,如果起不到定位的字段通常是不需要设置索引的。
2、数据量小的表不设置索引
表的记录过少(例如小于1k)也不需要创建索引。因为这时候是否创建索引对于查询效率的影响并不大,甚至查询所花的时间还比遍历索引时间更短,索引此时就不会产生优化效果。
3、有大量重复数据的列上不要设置索引
在条件表达式中经常用到的不同值较多的列上创建索引,但是字段中如果存在大量重复数据(比如高于10%),就不要建立索引。例如学生表的性别字段,只有男和女两个值,因此无需建立索引。因为有索引的情况下不但不会提高查询效率,反而会严重降低数据更新速度。
4、避免对经常更新的表创建过多的索引
频繁更新的字段不一定要创建索引,因为更新数据的时候也要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。避免对经常更新的表创建过多的索引,并且索引中的列尽可能少,此时虽然会提高查询速度,但是会降低更新表的速度。
5、不建议用无序的值作为索引
一些字段例如身份证、MD5、HASH、UUID(在索引比较的时候需要转换为ASCII),并且插入的时候可能会导致页的分裂。
6、删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原来的一些索引方式可能不再需要,数据库管理员应当定期找出这些索引,并删除他们,以减少索引对更新操作的影响。
7、不定义冗余或者重复的索引
(1)冗余索引
有时候会对同一个列创建了多个索引,例如:index(a,b,c)就相当于index(a)、index(a,b)、index(a,b,c);如果已经创建了a、b、c的联合索引,又创建了a的单列索引就产生了冗余。
(2)重复索引
CREATE TABLE repeat_index_demo ( col1 INT PRIMARY KEY, col2 INT, UNIQUE uk_idx_c1 (col1), INDEX idx_c1 (col1) );对col1字段就存在重复索引,它既是主键,又给定义了唯一索引和普通索引,但是主键本身就会生成聚簇索引,因此唯一索引和普通索引是重复的。
