首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL 8.0索引合并 - 优化器如何处理OR条件查询?

MySQL 8.0索引合并 - 优化器如何处理OR条件查询?

原创
作者头像
贺春旸的技术博客
发布2025-01-03 15:16:05
发布2025-01-03 15:16:05
5050
举报
文章被收录于专栏:DBA 平台和工具DBA 平台和工具

在MySQL 8.0中,优化器对OR条件查询的处理逻辑有了显著的改进,特别是在索引合并方面。

背景

在MySQL 5.7中,对于以下查询:

代码语言:sql
复制
select * from t1 where cid=3 or info='ccc';

优化器无法有效利用索引,因为OR条件查询通常会导致全表扫描,特别是当两个条件分别使用不同的索引时。

MySQL 8.0中的改进

在MySQL 8.0中,优化器引入了索引合并(Index Merge)的概念,能够更有效地处理OR条件查询。

假设我们有以下表结构和数据:

代码语言:sql
复制
CREATE TABLE t1 (
    id INT PRIMARY KEY,
    cid INT,
    info VARCHAR(255),
    KEY idx_cid (cid),
    KEY idx_info (info)
);

INSERT INTO t1 (id, cid, info) VALUES
(1, 3, 'aaa'),
(2, 3, 'bbb'),
(3, 4, 'ccc'),
(4, 5, 'ccc');

对于查询:

代码语言:sql
复制
select * from t1 where cid=3 or info='ccc';

MySQL 8.0的处理步骤如下:

  • 使用idx_cid索引查找cid=3的记录,得到主键ID为1和2。
  • 使用idx_info索引查找info='ccc'的记录,得到主键ID为3和4。
  • 合并并去重这两组主键ID,得到最终的主键ID列表为1, 2, 3, 4。
  • 根据主键ID列表1, 2, 3, 4回表获取完整记录,得到结果集:
代码语言:txt
复制
(1, 3, 'aaa'),
(2, 3, 'bbb'),
(3, 4, 'ccc'),
(4, 5, 'ccc');

总结

通过索引合并,MySQL 8.0能够更有效地处理OR条件查询,充分利用现有的索引,避免全表扫描,从而提高查询性能。这种优化在处理复杂查询条件时尤为重要,能够显著提升数据库的响应速度和效率。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • MySQL 8.0中的改进
  • MySQL 8.0的处理步骤如下:
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档