文章目录
- 原文:
- 一、索引分类。
- 1、普通索引:
- 2、唯一索引:
- 3、主键索引:
- 4、单列索引:
- 5、联合索引:
- 二、索引的创建原则。
- 1、字段的数值有唯一性限制。
- 2、频繁作为WHERE查询条件的字段。
- 3、经常使用GROUP BY和ORDER BY的列。
- 4、 根据待排序字段的数量来确定建立单列索引或者联合索引。
- 5、DISTINCT字段。
- 6、多表JOIN建立索引及注意事项。
- 7、使用类型小的列建立索引。
- 8、使用字符串的前缀创建索引。
- 9、区分度高(散列性高)的列适合做索引。
- 10、使用最频繁的列放到联合索引的最左边。
- 11、在多字段都需要建立索引的情况下,联合索引优于单列索引。
- 三、为什么要限制索引的数目。
- 四、为什么要限制索引的数目。
一、索引分类。
1、普通索引:
添加普通的索引不会对原来的列产生任何影响,该索引只用来提高查询效率(该列是否非空,是否唯一由列本身的约束条件约束)。
2、唯一索引:
添加唯一索引的列不允许出现重复值,否则报错,但允许有空值(一个表可以有多个唯一索引)。
3、主键索引:
一种添加了非空限制的特殊唯一索引,因为数据存储在文件中只能按一种顺序存储,所以一张表中只允许有一个主键索引。
4、单列索引:
可以是前面三种索引,只要保证该索引对应的是单一列即可,一个表中可以有多个单列索引。
5、联合索引:
由表中的多个列共同构成,遵循最左前缀原则。比如建立联合索引(dept_id,name,score)只有使用到dept_id字段才可能使用name字段、score字段。 下面举个例子: 在某员工表中,建立了(dept_id,name,score)的联合索引。 目标:需要查找dept_id=1,name=a的员工。 只有使用了索引的dept_id字段,才能找到所有的dept_id=1的员工,只有在这基础上再使用name字段才能正确找到dept_id=1,name=a的员工;如果一上来就找name=a的员工,使用的就不是这个联合索引了(可能是name字段的单列索引)。 下面给出一种使用联合索引所有字段的情况:查找dept_id=1,name=b,score=3的员工。 先通过dept_id字段找到所有dept_id=1的员工,在此基础上,再通过name字段找到dept_id=1,name=b的所有员工,在此基础上,再通过score字段找到目标。(在这个过程中,只有左边的索引字段被用到了,右边的索引字段才可能被用到)
二、索引的创建原则。
1、字段的数值有唯一性限制。
索引本身可以起到约束的作用,若表中的某一列是需要唯一约束的,可以直接给它建立唯一索引或者主键索引。这样不仅可以达到约束的目的,还可以通过该索引更快速地确定某条记录。
2、频繁作为WHERE查询条件的字段。
索引的作用就是在一定程度上提高查询效率的,当WHERE语句频繁使用某字段的时候,说明要以该列为标准对表数据进行处理,为了提高效率,我们应该为其创建索引,哪怕是普通索引,所能提升的效率也是非常显著的。
3、经常使用GROUP BY和ORDER BY的列。
根据待排序字段的数量来确定建立单列索引或者联合索引。
4、 根据待排序字段的数量来确定建立单列索引或者联合索引。
索引加快了WHERE的筛选速率,若UPDATE/DELETE的字段是非索引字段的话,效率提升得更为明显,因为非索引字段的更新或删除不涉及到索引的维护。
5、DISTINCT字段。
索引会将数据按一定顺序排列,相同的数据都是紧挨着的,这时候再去重,效率当然高。
6、多表JOIN建立索引及注意事项。
(1)连接的表数量不超过3。
(2)对WHERE创建索引,WHERE是用来过滤数据的,特别是在记录很多的情况下,WHERE没有索引是一件很糟糕的事情。
(3)对连接字段创建索引,并且该字段在多表的类型必须一致(这里并不是说不一致不能得到结果,只是性能会很差,涉及到了类型转换。特别是在记录很多的情况下)。
7、使用类型小的列建立索引。
类型小指的是数据范围小,数据范围小有两个好处:一、查询时,比较操作快;二、占用的存储空间少。
8、使用字符串的前缀创建索引。
比如某字段类型为name VARCHAR(255),那我们可以选择name(10)建立索引。这样既节约空间,又节省字符串的比较时间。
9、区分度高(散列性高)的列适合做索引。
其实就是选低重复、少重复的列,比如gender列就不适用建立索引(不是男就是女)
10、使用最频繁的列放到联合索引的最左边。
联合索引遵循最左前缀原则。
11、在多字段都需要建立索引的情况下,联合索引优于单列索引。
三、为什么要限制索引的数目。
索引并不是越多越好的!!!
索引需占用
- 磁盘空间,索引越多,需要的磁盘空间就越大。
- 索引会影响INSERT、UPDATE、DELETE等语句的性能,而且在数据修改的同时,索引也需要进行维护,从而产生一定的负担。
- 优化器在选择如何优化查询的时候会对比各个索引,从中挑选一个最优的方案,索引过多,会加剧优化器的工作时间,从而降低查询性能。
四、为什么要限制索引的数目。
1、WHERE使用不到的字段。 索引的价值是快速定位,如何起不到定位作用的字段一般是不需要建立索引的。
2、数量少的表格。 索引维护也需要时间。
3、有大量重复数据的列。 比如gender列就不适用建立索引(不是男就是女)
4、避免对经常更新的表创建过多的索引。
5、不建议用无序值做索引。 无序数据可能导致多次中间插入,严重加剧了索引维护的成本。(比如在数列中间插入数据,是需要将其他数据移动的,数据量越大,成本越高)
6、删除不再使用或者很少使用的索引。
7、不要定义冗余或重复的索引。