667 字
3 分钟
面试鸭-在MySQL中建索引I时需要注意哪些事项?

在MySQL中建索引时需要注意哪些事项?#

记忆方式: 首先不是越多越好,然后有3个情况是不建议建索引的,有两种情况建议建索引

首先,索引不是越多越好,建索引是会占磁盘空间的,并且也会影响写的效率,因为每个索引都需要去维护一颗B+树,插入数据时要维护已存在的索引。

建索引一般要考虑下面这几点:

  1. 区分度低的,比如性别这种字段,不建议建索引,因为只有几种情况过滤不了多少数据。
  2. 写多读少的表,不建议建索引,因为索引多了会影响写速度,每次写都需要维护存在的索引,得不偿失。
  3. 大字段不建议建索引,像text这种可能一个字段存的数据可能特别多的,索引的B+树占用空间太大,加载到内存耗时,但是可以考虑建前缀索引。
  4. 频繁使用的字段要建索引,为了常用查询都能用上索引。
  5. 排序字段和分组字段需要建索引,能避免临时表和文件排序(也就是全部数据读取出来再进行排序的情况)

问题#

怎么判断一个索引有没有用要不要删掉?#

看两个指标

  1. 看使用频率,可以查询表sys.schema_unused_indexes或开启慢查询日志分析,长期没有用到可以考虑删掉。
  2. 看是否冗余,可以查询表sys.schema_redundant_indexes,比如有联合索引(a,b),但是还建了索引a,那么这个单列索引a就是冗余索引。

线上加索引会锁表吗?#

不会,目前的MySQL支持在线DDL,InnoDB会创建一个临时的新表,慢慢的构建索引,然后在这期间的所有DML操作会被记录日志,然后在变更完成后应用。但是还是会影响性能,建议在低峰期去进行操作。

联合索引和多个单列索引有什么区别?#

联合索引是一颗B+树,多个单列索引是多棵B+树,查询时,如果是单列索引那一般只会用上一个索引,联合索引可以用上多个列来进行过滤。比如where a=1 and b=2,如果使用联合索引可以同时用上a和b来过滤,如果是多个单列索引,那只会用上a索引或者b索引。较高版本的MySQL可以利用多个单列索引来一起进行过滤,但是速度还是不如联合索引。

面试鸭-在MySQL中建索引I时需要注意哪些事项?
http://www.shineacz.top/posts/面试鸭-在mysql中建索引时需要注意哪些事项/
作者
shineAcZ
发布于
2026-03-13
许可协议
CC BY 4.0