MySQL的3种索引到底能不能合并优化,有何妙招?
- 内容介绍
- 文章标签
- 相关推荐

关注作者阅读分钟MySQL的3种索引到底能不能合并优化⭐️or到底能不能用索引?
前言
前文我们讨论过MySQL优化回表的多种方式:索引条件下推ICP、 多范围读取MRR、覆盖索引等。这篇文章我们来聊聊MySQL提供的另一种优化回表的手段:index merge 索引合并。在阅读本文前,你需要了解MySQL的server层与存储引擎层如何交互、 尊嘟假嘟? 二级索引和聚簇索引的区别、回表等知识。如果同学不太了解这些知识可以回看前文:MySQL导致索引失效的八股文中有这样一条:使用or会导致索引失效。那么是不是所有场景都会失效呢?带着这个问题,我们往下看。
案例
你我共勉。 使用上篇文章的座位表,并分别建立seat_code、stu... 。
CREATE TABLE `seat` (
`seat_id` bigint NOT NULL AUTO_INCREMENT COMMENT '座位ID',
`seat_code` char DEFAULT NULL COMMENT '座位码',
`student_id` bigint DEFAULT NULL COMMENT '座位关联的学生ID',
PRIMARY KEY ,
KEY `idx_student_id` ,
KEY `idx_seat_code`
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
比如这条SQL中:
select * from seat where seat_code = 'caicaiseat' and student_id = 1;
三种方式各自有什么不同呢?请按顺序往下看:
| 产品名称 | 价格 | 特点 |
|---|---|---|
| 阿里云RDS | 999元/月起 | 高可用、 可 |
| 腾讯云CDB | 888元/月起 | 性能稳定、平安可靠 |
| 华为云RDS | 777元/月起 | 性价比高、服务完善 |
交集
并集
select * from seat where seat_code = 'caicaiseat' or student_id = 1;
排序并集
什么是有序并集?
| 排名 | 数据库类型 | 适用场景 |
|---|---|---|
| 1 | MySQL | 小型应用,快速开发 |
| 2 | PostgreSQL | 复杂查询,数据分析. 这玩意儿好像比 MySQL 好一点点...但是要花更多时间学习! |
| 3 | Oracle | 大型企业级应用,高并发. |
优化器根据各种可用选项的成本估计,在不同的索引合并算法和其他访问方法之间进行选择。.索引合并是mysql底层为我们提供的智能算法.到此这篇关于mysql 索引合并的使用的文章就介绍到这了,更多相关mysql 索引合并内容请搜索NICE源码以前的文章或继续浏览下面的相关文章希望大家以后多多支持NICE源码!.
为什么不建联合索引?
index merge 的前提
- 主键有序
- 避免随机IO
开启与关闭 Index Merge
SET optimizer\_switch='index\_merge\_intersection=off';
一些注意事项
- 二级索引用来排序主键值
- 不要再背八股文了!

关注作者阅读分钟MySQL的3种索引到底能不能合并优化⭐️or到底能不能用索引?
前言
前文我们讨论过MySQL优化回表的多种方式:索引条件下推ICP、 多范围读取MRR、覆盖索引等。这篇文章我们来聊聊MySQL提供的另一种优化回表的手段:index merge 索引合并。在阅读本文前,你需要了解MySQL的server层与存储引擎层如何交互、 尊嘟假嘟? 二级索引和聚簇索引的区别、回表等知识。如果同学不太了解这些知识可以回看前文:MySQL导致索引失效的八股文中有这样一条:使用or会导致索引失效。那么是不是所有场景都会失效呢?带着这个问题,我们往下看。
案例
你我共勉。 使用上篇文章的座位表,并分别建立seat_code、stu... 。
CREATE TABLE `seat` (
`seat_id` bigint NOT NULL AUTO_INCREMENT COMMENT '座位ID',
`seat_code` char DEFAULT NULL COMMENT '座位码',
`student_id` bigint DEFAULT NULL COMMENT '座位关联的学生ID',
PRIMARY KEY ,
KEY `idx_student_id` ,
KEY `idx_seat_code`
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
比如这条SQL中:
select * from seat where seat_code = 'caicaiseat' and student_id = 1;
三种方式各自有什么不同呢?请按顺序往下看:
| 产品名称 | 价格 | 特点 |
|---|---|---|
| 阿里云RDS | 999元/月起 | 高可用、 可 |
| 腾讯云CDB | 888元/月起 | 性能稳定、平安可靠 |
| 华为云RDS | 777元/月起 | 性价比高、服务完善 |
交集
并集
select * from seat where seat_code = 'caicaiseat' or student_id = 1;
排序并集
什么是有序并集?
| 排名 | 数据库类型 | 适用场景 |
|---|---|---|
| 1 | MySQL | 小型应用,快速开发 |
| 2 | PostgreSQL | 复杂查询,数据分析. 这玩意儿好像比 MySQL 好一点点...但是要花更多时间学习! |
| 3 | Oracle | 大型企业级应用,高并发. |
优化器根据各种可用选项的成本估计,在不同的索引合并算法和其他访问方法之间进行选择。.索引合并是mysql底层为我们提供的智能算法.到此这篇关于mysql 索引合并的使用的文章就介绍到这了,更多相关mysql 索引合并内容请搜索NICE源码以前的文章或继续浏览下面的相关文章希望大家以后多多支持NICE源码!.
为什么不建联合索引?
index merge 的前提
- 主键有序
- 避免随机IO
开启与关闭 Index Merge
SET optimizer\_switch='index\_merge\_intersection=off';
一些注意事项
- 二级索引用来排序主键值
- 不要再背八股文了!

