MySQL如何创建联合索引?

星静君_7884

星静君_7884

2026-08-25

199人浏览

原创

联合索引字段顺序不能随便调换,因b+树按定义顺序逐列排序,必须满足最左前缀匹配才能命中索引;等值查询字段应放最左,高区分度字段优先但需结合查询模式,避免冗余索引。

mysql如何创建联合索引?

联合索引不是“把WHERE里出现的字段全加进去”,而是按查询模式和B+树匹配规则来设计的——顺序错、类型错、条件漏,建了也白建。

CREATE INDEX 语句怎么写才有效

语法本身很简单,但关键在括号里的字段顺序和表状态:

  • CREATE INDEX 只能建普通索引,不能建主键或唯一约束;已有表用它最直接
  • 字段必须按「等值 → 范围 → 排序」逻辑排列,比如高频查 status = 'done' 且常带 user_id = ? 和 created_at > ?,就该建 CREATE INDEX idx_status_uid_ct ON orders (status, user_id, created_at)
  • 别在 VARCHAR 字段上盲目加长度限制(如 name(10)),除非你明确只比对前10字符——否则可能漏匹配
  • 建完立刻 SHOW INDEX FROM orders 确认 Seq_in_index 列是否按预期递增,避免 Navicat 里误操作导致多行同名索引变成多个单列索引

为什么 EXPLAIN 显示 key 为空

明明建了 (a, b, c),但 EXPLAIN SELECT * FROM t WHERE b = 1 AND c = 2 还是走全表扫描,常见原因:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • WHERE 条件跳过了最左列(a 没出现),B+树无法定位起点,直接失效
  • a 是 INT 类型,但查询写了 WHERE a = '123' ——隐式转换让索引失效,改用 WHERE a = 123
  • 字段值区分度太低(比如 gender 只有 'M'/'F'),优化器估算走索引比扫全表还慢,会主动跳过;可用 FORCE INDEX(idx_name) 验证,但别在线上长期用
  • 表太小(

Navicat 里建联合索引容易踩的坑

图形界面隐藏细节多,新手常在这里翻车:

  • 右键表 →「设计表」→ 切到「索引」标签页后,**必须点左下角「+」新增一行**,再填字段;直接在字段定义区勾选「索引」只会建单列索引
  • 同一索引名(如 idx_user_status)要对应多行,每行填一个字段 + 排序方向;如果填了三行但 Index Name 不一致,Navicat 就当你是建了三个单列索引
  • Length 栏不要乱填:只有对超长 VARCHAR 做前缀索引时才设值(如 email(20)),否则留空;填了却没实际用前缀匹配,索引效果打折
  • 建完别忘了点「保存」——Navicat 不会自动提交,关窗口前务必确认弹窗提示已保存

联合索引和单列索引要不要共存

冗余索引不光浪费磁盘,还会拖慢 INSERT/UPDATE,判断标准很实在:

  • 已有 INDEX (a, b),再建 INDEX (a) 是纯冗余——前者完全能替代后者
  • 但 INDEX (a, b) 和 INDEX (b) 不冗余,因为 WHERE b = ? 无法用前者加速
  • 用 SELECT * FROM sys.schema_unused_indexes(MySQL 8.0+)或 pt-duplicate-key-checker 扫一遍线上库,比凭感觉删更可靠
  • 别为了「覆盖所有可能组合」建一堆索引,比如 (a,b)、(a,c)、(b,c) ——先看慢查日志里真实出现的 WHERE 组合,再针对性建

最常被忽略的一点:联合索引生效的前提,是 SQL 条件严格遵循最左前缀,而这个“前缀”不是字符串意义上的前缀,是 B+ 树检索路径上的连续列。哪怕只差一个等值条件没写,后面所有列都作废。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4163

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1089

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6061

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2943

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6040

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8101

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习