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_name | Seq_in_index | Column_name |
|---|---|---|
| idx_cl_id_id | 1 | cl_id |
| idx_cl_id_id | 2 | id |
另外,还有个更直观的方法:执行SHOW CREATE TABLE activities;,这个语句会直接输出表的完整定义,包括所有索引的完整结构,你会看到类似这样的行:
KEY `idx_cl_id_id` (`cl_id`, `id`)
多级索引与非聚集索引:不是同一概念
这两个是完全不同维度的索引概念,别搞混了:
- 多级(联合)索引:是从索引包含的字段数量来定义的,指一个索引同时关联多个字段,和索引的存储结构无关。它既可以是聚集索引,也可以是非聚集索引(不过InnoDB里只有主键是聚集索引,所以只有联合主键才是聚集的联合索引,其他联合索引都是非聚集的)。
- 非聚集索引:是从索引的存储方式来定义的,和聚集索引相对。InnoDB中,非聚集索引的叶子节点存储的是主键值,需要通过主键再去聚集索引中查找完整数据(也就是「回表查询」);而聚集索引的叶子节点直接存储整行数据(InnoDB的主键默认就是聚集索引)。
举个例子:你之前创建的(u_id, cl_id)联合索引,就是非聚集的联合索引。
内容的提问来源于stack exchange,提问作者Crysis
相关产品推荐
相关产品推荐

