Skip to content

MySQL 索引设计原则

什么情况下适合使用索引

字段或字段组合存在唯一性

索引中有一种索引叫做:主键索引,这种索引是根据我们表的主键去创建的索引。

一个表中可以存在一个主键或者是多主键,也就是说通过 主键 我们可以找到唯一的值,像这样的字段去做索引是非常好的。

那除去这种 主键 字段,还有什么可以字段可以去做索引呢?

  • 学生表 - 学号
  • 人员档案表 - 手机号、证件号
  • 订单表 - 订单编号

类似上面这些字段,我们可以创建 唯一性索引,一样可以加速我们的查找,提升性能。

具有关联性的字段

我们在写 SQL 语句的时候,经常会在 WHERE 或者 关联查询 中使用某些字段当做筛选条件或者是关联条件去做查询。

类似这样的字段我们可以去通过创建索引去提高查找速度。

拓展

  • 如果进行 UPDATE 操作的时候,要更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。
  • UPDATE 时,WHERE 条件中的过滤条件列,如果使用到了索引,锁行;无法用索引,锁表。按照索引规则,如果能使用索引,锁行,不能使用索引,锁表。

经常使用 GROUP BY 或者 ORDER BY 的列

索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要对分组或者排序的字段进行索引 。如果待排序的列有多 个,那么可以在这些列上建立组合索引 。

DISTINCT 字段

有的时候,我们也会用到 DISTINCT 进行去重,我们也可以对这些字段进行创建索引。

原理就是索引会对数据按照某种顺序进行排序,所以在去重的时候也会快很多。

注意

一般情况下,我们很少会对 DISTINCT 的字段进行创建索引~,所以这里各位了解即可。

数据范围小的列

我们在创建表的时候,可以有多种数据类型去修饰我们的列类型,好比:INTVARCHARDATEDECIMAL 等等,但是,在这其中还有一些比较 的数据类型,类似:BIGINTTINYBLOBTEXT

这些比较 的数据类型,它们的占用空间太大了,如果创建了索引,索引也是非常大的,所以说,这些字段是不推荐被创建索引的。

TIP

我们在设计表的时候,尽量去多考虑我们的数据结构,如果能使用 的数据类型,就尽量使用小的数据类型。

数据类型越 ,被创建出来的索引也就越小,而且我们在查找的时候,一个数据页就可以放下更多的记录,这对查找数据是绝对有利的!!!

数据类型占有比大的

我们对于某一个字段是否要创建索引,其中一个很重要的参考点是:这个列的数据是否类型很多!

好比像学生表,我们要对性别这一列进行创建索引,但是我们可以思考一下,性别无非几种:男、女、未填写。

也就是说这一列数据只有三种数据类型,如果我们根据性别去查询数据,那么 MySQL 是大概率不会走索引,而是走全表查询。

而我们要是对学生学号、手机号、证件号这种字段去创建索引,这个相对性别这种字段会好的多得多。

INFO

联合索引中,尽量将“学号”、“手机号”、“证件号”放在索引的前面。

  • 错误示例:CREATE INDEX I_INDEX_001 ON student(sex);

  • 错误示例:CREATE INDEX I_INDEX_001 ON student(createDt, deleteFlag, studentNo);

  • 正确示例:CREATE INDEX I_INDEX_001 ON student(studentNo, createDt);

那些情况不适合使用索引

WHERE 条件中用不到的字段

WHERE 后面跟的是筛选条件,如果说条件中不存在的字段,尽量不要去创建索引!

INFO

例如

sql
SELECT id, no, name, age, birthday FROM student WHERE no = 1;

我们现在要去创建索引,则只需要对 no 字段创建索引即可,可以不需要对其他列进行创建。

拓展

但是!!!

要知道,索引除去它本身的作用,它也是可以提供一定量的数据。

有的时候我们经常将 SELECT 的列同 WHERE 中筛选条件的列一同创建联合索引,而 SELECT 的列之所以也一起创建到索引中,目的就是为了不读表,直接从索引中拿到数据。

数据量少的表

当你的表中全量数据很少的时候,这里是不建议去创建索引,直接全表查即可。

拓展

但如果说表中数量少,但是经常使用的,例如 ORG 表,建议还是增加索引,毕竟直接从索引查询数据的速度远远比从磁盘扫描更快。

数据类型占有比小的

和上面占有比大的相对,就好比性别这种列,完全没有必要去为它单独创建索引。

创建索引的注意点

索引不要创建太多

索引本身也是需要占用一定量的空间,所以尽可能的不要创建太多的索引,最好是可以让程序运行一段时间,然后归纳整理好需要的列,然后统一创建索引。

尽量使用联合索引(多列索引)

使用联合索引可以让我们在查询的时候优化器更好的规划我们SQL的执行,毕竟这会关系到我们 SQL 执行的速度。

战略性索引

当我们表的数据量有很多,或者是经常被修改(添加、修改、删除)的表,尽量规划好索引,然后去创建,因为每次的修改操作,也会同步修改索引。

不要定义重复索引

我们在创建索引前,一定要去看我们的表中是否有类似的索引,如果有,就不要再去创建了。

总结

索引是一个双刃剑,用的好了,可以说是如虎添翼,用的不好,直接雪上加霜。

以上的所有文档是给你参考用的,实战中要灵活使用,不要太拘谨,程序是自由的。