索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍。
- 哪些情况适合创建索引
1)字段的数值有唯一性的限制
业务上具有唯一特性的字段,即使是组合字段,也必须加上唯一索引。
2)频繁作为WHERE查询条件的字段
3)经常GROUP BY 和ORDER BY 的列
4)UPDATE DELETE 的 WHERE条件列
5) DISTINCT字段需要创建索引
6) 多表JOIN链接操作时,创建索引注意事项
首先,连接表的数量尽量不要超过 3 张 ,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增 长会非常快,严重影响查询的效率。
其次, 对 WHERE 条件创建索引 ,因为 WHERE 才是对数据条件的过滤。如果在数据量非常大的情况下, 没有 WHERE 条件过滤是非常可怕的。
最后, 对用于连接的字段创建索引 ,并且该字段在多张表中的 类型必须一致 。比如 course_id 在 student_info 表和 course 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型。
7)使用列的类型小的创建索引
8)使用过长字符串前缀作为索引,但无法支持使用索引排序,只能用文件排序
count(distinct left(列名, 索引长度))/count(*)例:越接近1越好,差不多则截取短的select count(distinct left(address,10)) / count(*) as sub10, -- 截取前10个字符的选择度count(distinct left(address,15)) / count(*) as sub11, -- 截取前15个字符的选择度count(distinct left(address,20)) / count(*) as sub12, -- 截取前20个字符的选择度count(distinct left(address,25)) / count(*) as sub13 -- 截取前25个字符的选择度from shop;
9)区分度高(散列性高)的列适合作为索引
select count(distinct a)/count(*) from t1; 越近1越好,一般超过33%就是比较高效的索引了。
10)使用最频繁的列放到联合索引的左侧
11)在多个字段都要创建索引的情况下,联合索引优于单值索引
注意:限制单张表索引不要超过6个。
- 哪些情况不适合创建索引
1) 在where中使用不到的字段,不要设置索引
2) 数据量小的表最好不要使用索引,比如不到 1000 行,是不需要创建索引的。
3) 有大量重复数据的列上不要建立索引,比如重复率高于 10% 的时候,也不需要对这个字段使用索引。
举例1:要在 100 万行数据中查找其中的 50 万行(比如性别为男的数据),一旦创建了索引,你需要先 访问 50 万次索引,然后再访问 50 万次数据表,这样加起来的开销比不使用索引可能还要大。
4) 避免对经常更新的表创建过多的索引
5) 不建议用无序的值作为索引
例如身份证、UUID(在索引比较时需要转为ASCII,并且插入时可能造成页分裂)、MD5、HASH、无序长字 符串等。
6) 删除不再使用或者很少使用的索引
7) 不要定义冗余或重复的索引
