631 字
3 分钟
面试鸭-MySQL中的索引数量是否越多越好?为什么?

MySQL中的索引数量是否越多越好?为什么?#

记忆方式:从时间上看,从空间上看

当然不是,建索引过多会导致时间和空间上都会有影响。

从时间上看,建的索引越多,写的速度就越慢。这是因为B+树需要维护有序性,每当插入一条新数据,就得把这个表的所有二级索引都维护一遍来保持有序,在这个时候还可能发生页分裂、页合并,写放大问题会很严重,索引过多会大大影响到写入性能。

从空间上看,索引占用的空间并不小,若对应主键是比较大的类型,则这个问题就更严重了。每一棵二级索引的B+树的每个节点都是16kb的大小,若数据量大起来,磁盘占用和内存开销也会顶不住。

问题:#

索引选择性是什么?怎么判断一个字段适不适合建索引?#

根据这个字段的区分度来决定,一般可以使用COUNT(distinct column) / COUNT(*)的值来判断是否合适,如果接近或等于1就代表比较适合,如果接近0.1的就基本可以判断不适合创建索引了,比如性别字段这种基本没有区分度的就不适合。

联合索引的字段顺序怎么确定?#

遵循3个原则:

  1. 等值查询放在前面,范围查询放在后面。
  2. 区分度高的放前面,能过滤更多数据。
  3. ORDER BY后面的字段要放进联合索引,可以避免file sort。

怎么找出数据库里的无用索引?#

可以查询MySQL的sys库,使用select * from sys.schema_unused_indexes可以查询没有用到的索引。但是要注意,每次数据库重启它的数据就会清空,要运行一段时间再查,比较准确。

建了很多索引,想删一些,怎么评估影响?#

可以在测试环境下,使用EXPLAIN运行核心的一些SQL语句,然后看key那一列使用的索引,记住对应查询使用的对应索引。然后在测试环境下,高压测试有索引和没有索引的效率有什么影响,以此来评估这个索引是否有存在的意义。另外有些索引虽然查询不用,但是可能是为了唯一索引而建的,删之前还需要确认一下。

面试鸭-MySQL中的索引数量是否越多越好?为什么?
http://www.shineacz.top/posts/面试鸭-mysql中的索引数量是否越多越好为什么/
作者
shineAcZ
发布于
2026-03-13
许可协议
CC BY 4.0