You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL多级索引创建、查询方法及与非聚集索引的区别

嘿,我来帮你理清这些关于MySQL索引的问题,都是日常开发里经常碰到的点,咱们一个个来解决:

创建多级(联合)索引的SQL语句

首先得明确,你说的「多级索引」其实就是MySQL里的联合索引(复合索引)——也就是在多个字段上创建的单个索引,能优化同时涉及这些字段的查询。针对你提到的cl_id和id,有两种创建方式,注意字段顺序非常关键(影响查询的左前缀匹配规则):

  • 如果你的查询场景经常是先按cl_id过滤,再用id排序/过滤(比如WHERE cl_id = ? ORDER BY id),推荐把cl_id放在前面:
ALTER TABLE activities ADD INDEX idx_cl_id_id (cl_id, id);
  • 要是有特殊需求需要先按id过滤再匹配cl_id(这种场景很少见,因为id是主键本身就有唯一索引),可以反过来:
ALTER TABLE activities ADD INDEX idx_id_cl_id (id, cl_id);
查看联合索引的详细字段结构

你用SHOW INDEXES FROM activities;是正确的,但需要重点关注结果里的两个字段,才能看出联合索引的组成:

  • Key_name:同一个联合索引下的所有字段会共享同一个索引名称
  • Seq_in_index:表示当前字段在联合索引里的位置(从1开始计数),通过这个就能清楚看到一个索引包含哪些字段,以及它们的顺序

举个实际的例子,如果你创建了idx_cl_id_id,执行SHOW INDEXES后会看到类似两行结果:

Key_nameSeq_in_indexColumn_name
idx_cl_id_id1cl_id
idx_cl_id_id2id

另外,还有个更直观的方法:执行SHOW CREATE TABLE activities;,这个语句会直接输出表的完整定义,包括所有索引的完整结构,你会看到类似这样的行:

KEY `idx_cl_id_id` (`cl_id`, `id`)
多级索引与非聚集索引:不是同一概念

这两个是完全不同维度的索引概念,别搞混了:

  • 多级(联合)索引:是从索引包含的字段数量来定义的,指一个索引同时关联多个字段,和索引的存储结构无关。它既可以是聚集索引,也可以是非聚集索引(不过InnoDB里只有主键是聚集索引,所以只有联合主键才是聚集的联合索引,其他联合索引都是非聚集的)。
  • 非聚集索引:是从索引的存储方式来定义的,和聚集索引相对。InnoDB中,非聚集索引的叶子节点存储的是主键值,需要通过主键再去聚集索引中查找完整数据(也就是「回表查询」);而聚集索引的叶子节点直接存储整行数据(InnoDB的主键默认就是聚集索引)。

举个例子:你之前创建的(u_id, cl_id)联合索引,就是非聚集的联合索引。

内容的提问来源于stack exchange,提问作者Crysis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:58:17