Mysql 复合索引 误区实践
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,背景:很多dba在生产生活中经常会使用到mysql的联合索引,作者在工作中也经常遇到,本文讲解下其中的一个误区,sql语句中联合索引必须在where条件后面按索引字段的先后顺序写吗?下面案例将实际讲解
千家信息网最后更新 2025年11月08日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安全错误
数据库的锁怎样保障安全
家庭服务器IC仿真
中关村在线 服务器
上海宜园网络技术有限公司
嵌入式软件开发岗位要求
计算机网络技术的翻译
只显示代码的服务器怎么重启
四川成都app软件开发公司
计算机网络技术升本课程
塔式服务器拍摄
公司电脑怎么查看服务器url
数据库启动服务是哪个
石家庄通用服务器
青岛大贸网络技术有限公司
c 音视频软件开发
视频转码服务器 开源
网络安全保护员是做什么的
英特尔服务器未来发展
启动服务器管理器
服务器绩效考核管理
华为 办公软件开发技术
2021网络安全百强公司排名
c语言 调用数据库
cpu数据代表什么数据库
高中网络技术应用 教科版
广州触网软件开发公司
数据库安全审计报告书
物联网网络安全的基本内容
怎么描述数据库性能差
网络安全隐患自查整改小结
怎样利用SCI数据库