Mysql 复合索引 误区实践
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,背景:很多dba在生产生活中经常会使用到mysql的联合索引,作者在工作中也经常遇到,本文讲解下其中的一个误区,sql语句中联合索引必须在where条件后面按索引字段的先后顺序写吗?下面案例将实际讲解
千家信息网最后更新 2026年11月01日Mysql 复合索引 误区实践
背景:很多dba在生产生活中经常会使用到mysql的联合索引,作者在工作中也经常遇到,本文讲解下其中的一个误区,sql语句中联合索引必须在where条件后面按索引字段的先后顺序写吗?下面案例将实际讲解下
环境:os:centos7.4 mysql_version:mysql5.7.21
1、建表t2 创建了复合索引idx_con_update(realname,age)
CREATE TABLE `t2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`realname` varchar(255) NOT NULL,
`age` tinyint(1) NOT NULL DEFAULT '0',
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_con_update` (`realname`,`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、插入数据
(root@localhost:mysql.sock) [test]>select * from t2;
+----+----------+-----+---------------------+---------------------+
| id | realname | age | createdAt | updatedAt |
+----+----------+-----+---------------------+---------------------+
| 1 | kitten | 20 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 2 | kitten1 | 21 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 3 | kitten2 | 22 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 4 | kitten2 | 22 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 5 | kitten3 | 23 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 6 | kitten4 | 24 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 7 | kitten5 | 25 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 8 | kitten6 | 26 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 9 | kitten7 | 27 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 10 | kitten8 | 28 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 11 | kitten9 | 29 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
+----+----------+-----+---------------------+---------------------+
11 rows in set (0.00 sec)
3、查看执行计划
(root@localhost:mysql.sock) [test]>(root@localhost:mysql.sock) [test]>explain select * from t2 where realname='kitten5' and age=25\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ref
possible_keys: idx_con_update
key: idx_con_update
key_len: 768
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
分析执行计划:很明显 查询语句走了复合索引idx_con_update
把where条件顺序反一下是否还会走idx_con_update索引呢?看下面
(root@localhost:mysql.sock) [test]>explain select * from t2 where age=25 and realname='kitten5'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ref
possible_keys: idx_con_update
key: idx_con_update
key_len: 768
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.01 sec)
分析执行计划:查询条件顺序更换之后 查询依然走索引
总结:经常有同事、朋友咨询我索引的事情、所以大胆使用复合索引、不用担心索引字段的先后顺序
背景:很多dba在生产生活中经常会使用到mysql的联合索引,作者在工作中也经常遇到,本文讲解下其中的一个误区,sql语句中联合索引必须在where条件后面按索引字段的先后顺序写吗?下面案例将实际讲解下
环境:os:centos7.4 mysql_version:mysql5.7.21
1、建表t2 创建了复合索引idx_con_update(realname,age)
CREATE TABLE `t2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`realname` varchar(255) NOT NULL,
`age` tinyint(1) NOT NULL DEFAULT '0',
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_con_update` (`realname`,`age`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、插入数据
(root@localhost:mysql.sock) [test]>select * from t2;
+----+----------+-----+---------------------+---------------------+
| id | realname | age | createdAt | updatedAt |
+----+----------+-----+---------------------+---------------------+
| 1 | kitten | 20 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 2 | kitten1 | 21 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 3 | kitten2 | 22 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 4 | kitten2 | 22 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 5 | kitten3 | 23 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 6 | kitten4 | 24 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 7 | kitten5 | 25 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 8 | kitten6 | 26 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 9 | kitten7 | 27 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 10 | kitten8 | 28 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
| 11 | kitten9 | 29 | 2016-03-02 15:10:00 | 2016-03-08 16:28:00 |
+----+----------+-----+---------------------+---------------------+
11 rows in set (0.00 sec)
3、查看执行计划
(root@localhost:mysql.sock) [test]>(root@localhost:mysql.sock) [test]>explain select * from t2 where realname='kitten5' and age=25\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ref
possible_keys: idx_con_update
key: idx_con_update
key_len: 768
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
分析执行计划:很明显 查询语句走了复合索引idx_con_update
把where条件顺序反一下是否还会走idx_con_update索引呢?看下面
(root@localhost:mysql.sock) [test]>explain select * from t2 where age=25 and realname='kitten5'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t2
partitions: NULL
type: ref
possible_keys: idx_con_update
key: idx_con_update
key_len: 768
ref: const,const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.01 sec)
分析执行计划:查询条件顺序更换之后 查询依然走索引
总结:经常有同事、朋友咨询我索引的事情、所以大胆使用复合索引、不用担心索引字段的先后顺序
索引
顺序
条件
查询
先后
字段
语句
分析
误区
明显
不用
事情
作者
同事
实际
常会
数据
朋友
案例
环境
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网与科技
互联网黑科技
互联网科技行业发展
深圳互联网络科技有限公司
壹账通互联网科技
广州善班互联网科技
互联网科技视频素材
互联网金融监管科技
海南购全球互联网科技
江苏南京365互联网科技
哈尔滨新华互联网科技学院
欧洲十大科技互联网公司
知域互联网科技有限公司大骗子
中国互联网有什么科技
互联网科技年终奖
国产互联网科技公司
湖北辰鑫科技互联网
互联网公司属于科技吗
北京品多多互联网科技有限公司
恒生互联网科技趋势
上海万想互联网科技
中正互联网科技招聘
济南华为互联网科技产业总部基地
互联网为啥属于高科技
中国航天科技大学国际工业互联网
玉溪互联网科技怎么选
互联网媒体平台算高科技产业
国大互联网教育科技有限公司工作
中和天地互联网科技有限公司
广州互联网高科技取餐柜