MySQL的索引分类及创建原则

文章目录

  • 原文:
  • 一、索引分类。
      • 1、普通索引:
      • 2、唯一索引:
      • 3、主键索引:
      • 4、单列索引:
      • 5、联合索引:
  • 二、索引的创建原则。
      • 1、字段的数值有唯一性限制。
      • 2、频繁作为WHERE查询条件的字段。
      • 3、经常使用GROUP BY和ORDER BY的列。
      • 4、 根据待排序字段的数量来确定建立单列索引或者联合索引。
      • 5、DISTINCT字段。
      • 6、多表JOIN建立索引及注意事项。
      • 7、使用类型小的列建立索引。
      • 8、使用字符串的前缀创建索引。
      • 9、区分度高(散列性高)的列适合做索引。
      • 10、使用最频繁的列放到联合索引的最左边。
      • 11、在多字段都需要建立索引的情况下,联合索引优于单列索引。
  • 三、为什么要限制索引的数目。
  • 四、为什么要限制索引的数目。


原文:

MySQL的索引分类及创建原则

一、索引分类。

MySQL的索引分类及创建原则_第1张图片

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字段找到目标。(在这个过程中,只有左边的索引字段被用到了,右边的索引字段才可能被用到)

MySQL的索引分类及创建原则_第2张图片

二、索引的创建原则。

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、在多字段都需要建立索引的情况下,联合索引优于单列索引。

三、为什么要限制索引的数目。

索引并不是越多越好的!!!
索引需占用

  1. 磁盘空间,索引越多,需要的磁盘空间就越大。
  2. 索引会影响INSERT、UPDATE、DELETE等语句的性能,而且在数据修改的同时,索引也需要进行维护,从而产生一定的负担。
  3. 优化器在选择如何优化查询的时候会对比各个索引,从中挑选一个最优的方案,索引过多,会加剧优化器的工作时间,从而降低查询性能。

四、为什么要限制索引的数目。

1、WHERE使用不到的字段。 索引的价值是快速定位,如何起不到定位作用的字段一般是不需要建立索引的。
2、数量少的表格。 索引维护也需要时间。
3、有大量重复数据的列。 比如gender列就不适用建立索引(不是男就是女)
4、避免对经常更新的表创建过多的索引。
5、不建议用无序值做索引。 无序数据可能导致多次中间插入,严重加剧了索引维护的成本。(比如在数列中间插入数据,是需要将其他数据移动的,数据量越大,成本越高)
6、删除不再使用或者很少使用的索引。
7、不要定义冗余或重复的索引。

你可能感兴趣的:(【数据库】——MySQL学习,数据结构,链表,数据库架构,数据库开发,dba)