【MySQL精通之路】SQL优化(1)-查询优化(3)-索引合并

主博客:

【MySQL精通之路】SQL优化(1)-CSDN博客

上一篇:

【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客

下一篇:

目录

1.索引合并-交集访问算法

2.索引合并联合访问算法

3.索引合并-排序联合访问算法

4.影响索引合并优化


Index Merge访问方法检索具有多个范围扫描的行,并将其结果合并为一个。

博主PS。

没有索引合并逻辑之前:

数据库在where条件查询数据时,如果a条件查询完成后,a条件过滤出的主键去聚簇索引查找数据,(回表查询)。b条件,c条件同理。

最后在通过查询条件之间是and还是or对结果进行过滤,如果是and就取交集,如果是or就取并集。

索引合并后:

就提前做这个操作了。先把二级索引上过滤出的主键,根据查询条件是and还是or,取交集或并集。得出过滤后的主键之后,再用过滤后的主键进行回表查询,大大减少回表次数。


此查询仅合并来自单个表的索引扫描,而不合并跨多个表的扫描。合并可以生成其基础扫描的并集交集交集的并集

博主PS。之所以不可以跨表,是因为最终回表查询的时候要将过滤后的主键在同一个聚簇索引进行回表,所以不能跨表,跨表就等于在多个聚簇索引操作数据了。

可以使用索引合并的查询示例:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;SELECT * FROM tbl_nameWHERE (key1 = 10 OR key2 = 20) AND non_key = 30;SELECT * FROM t1, t2WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')AND t2.key1 = t1.some_col;SELECT * FROM t1, t2WHERE t1.key1 = 1AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

注意:

索引合并优化算法具有以下已知限制:

如果您的查询带有嵌套AND或OR复杂WHERE子句,并且MySQL没有选择最佳计划,请尝试使用以下标识转换来分发术语:

(x AND y) OR z => (x OR z) AND (y OR z)
(x OR y) AND z => (x AND z) OR (y AND z)

索引合并不适用于全文索引。

在EXPLAIN输出中,Index Merge方法在type列中显示为Index_Merge。

在这种情况下,键列包含使用的索引列表,key_len包含这些索引的最长键部分列表。

Index Merge访问方法有几种算法,显示在EXPLAIN输出的Extra字段中:

Using intersect(...)

Using union(...)

Using sort_union(...)

以下部分将更详细地描述这些算法。优化器根据各种可用配置的成本估计,在不同可能的索引合并算法和其他访问方法之间进行选择。

1.索引合并-交集访问算法

当WHERE子句与AND组合转换为不同键上的几个范围条件时,此访问算法适用,并且每个条件都是以下条件之一:

这种形式的N部分表达式,其中索引正好有N部分(即所有索引部分都被覆盖):

key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN

InnoDB表主键上的任何范围条件。

例如:

SELECT * FROM innodb_tableWHERE primary_key < 10 AND key_col1 = 20;SELECT * FROM tbl_nameWHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;

索引合并交集算法对所有使用的索引执行同时扫描,并生成从合并索引扫描中接收的行的交集。

如果查询中使用的所有列都被使用的索引覆盖,则不会检索完整的表行(不会回表查询)(在这种情况下,EXPLAIN输出在Extra字段中包含Using index)。

以下是这样一个查询的示例:

SELECT COUNT(*) FROM t1 WHERE key1 = 1 AND key2 = 1;

如果使用的索引没有覆盖查询中使用的所有列,则只有在满足所有使用键的范围条件时,才会检索完整的行。

如果合并的条件之一是InnoDB表主键上的条件,则不用于行检索,而是用于过滤使用其他条件检索的行。

2.索引合并联合访问算法

此算法与索引合并-联合算法的类似。当表的WHERE子句被转换为不同键上的几个范围条件并与OR组合时,该算法适用,并且每个条件都是以下条件之一:

1.这种形式的N部分表达式,其中索引正好有N部分(即所有索引部分都被覆盖):

key_part1 = const1 OR key_part2 = const2 ... OR key_partN = constN

2.InnoDB表主键上的任何范围条件。

3.索引合并交集算法适用的条件。

例如:

SELECT * FROM t1WHERE key1 = 1 OR key2 = 2 OR key3 = 3;SELECT * FROM innodb_tableWHERE (key1 = 1 AND key2 = 2)OR (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;

3.索引合并-排序联合访问算法

WHERE子句转换为OR组合的多个范围条件时,此访问算法适用,但索引合并联合算法不适用。

示例:

SELECT * FROM tbl_nameWHERE key_col1 < 10 OR key_col2 < 20;SELECT * FROM tbl_nameWHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

排序联合算法和联合算法之间的区别在于,排序联合算法必须首先获取所有行的行ID,并在返回任何行之前对其进行排序。

4.影响索引合并优化

索引合并的使用取决于optimizer_switch系统变量的index_merge, index_merge_intersection、index_merge_union, index_merge_sort_union标志的值。

参见“可切换优化”。

默认情况下,所有这些标志都处于启用状态。

若要仅启用某些算法,请将index_merge设置为禁用,并仅启用应允许的其他算法。

除了使用optimizer_switch系统变量来控制优化器在整个会话范围内使用索引合并算法之外,MySQL还支持优化器提示,以在每条语句的基础上影响优化器。

参见“优化器提示”。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

平衡发展与环保:理性看待地下式污水处理厂建设|中联环保圈

这些年啊&#xff0c;随着城市化进程越来越快&#xff0c;还有环境保护意识不断提高&#xff0c;这地下式污水处理厂慢慢就成了热门的建设趋势了。据相关统计&#xff0c;全球现在运行着 200 多座地下式污水处理厂呢&#xff0c;咱国家建成和在建的数量也差不多快到 200 座啦。…

基于transformers框架实践Bert系列4-文本相似度

本系列用于Bert模型实践实际场景&#xff0c;分别包括分类器、命名实体识别、选择题、文本摘要等等。&#xff08;关于Bert的结构和详细这里就不做讲解&#xff0c;但了解Bert的基本结构是做实践的基础&#xff0c;因此看本系列之前&#xff0c;最好了解一下transformers和Bert…

STM32入门笔记(02):USART串口通信注意事项笔记(SPL库函数版)

这是通过串口通信发送过来的数据&#xff0c;里面包括了故障码&#xff0c;电压&#xff0c;电流&#xff0c;频率等信息&#xff0c;请你用STM32f103系列单片机的串口1读取该数据并解析出电压和电流是多少&#xff1f; 要用STM32F103系列单片机的串口1读取并解析发电机上的逆…

【Django项目】 音乐网站spotify复刻

代码&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;该项目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口获取。

docker 命令总结

导出镜像下载 centos 镜像 docker pull centos:centos7.7.1908 常用命令 docker ps 查看正在运行的容器 docker ps -a 查看所有容器 docker images 查看本地已有镜像 停止所有容器 docker stop $(docker ps -aq) 停止某个容器 docker stop 容器名称 删除所有容器 dock…

Java基础入门day54

day54 servlet升级03 特点 当前设计又有一个问题&#xff0c;我们目前可以做到一个实体类用一个servlet&#xff0c;比如Student类的所有crud方法都可以在StudentServlet中的service方法中进行动态处理。假如又有User类&#xff0c;我们就要在UserServlet中设计service方法&a…

探索文档识别技术在加强教育资源共享与合作中的潜力

在数字化浪潮不断推进的今天&#xff0c;教育资源的共享与合作已经成为提高教学质量和效率的关键因素。文档识别技术作为一项强大的工具&#xff0c;在这一过程中发挥着至关重要的作用。本文旨在探讨如何通过文档识别技术的应用&#xff0c;促进教育资源的有效共享与教师、学校…

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

Adobe产品安装目录修改

进入安装包目录&#xff0c;进入到products文件夹 编辑driver.xml文件 将“InstallDir”修改为你需要安装的软件的目录&#xff0c;我这里是修改到D:\Adobe目录 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷贝RequestInfo这部分…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…

coveralls使用pytest进行本地测试时报错SyntaxError: invalid escape sequence \S

## 错误复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python.git cd coveralls-python poetry install poetry run pytest## 错误内容&#xff1a; ## 完整的打印信息 test session starts platform darwin -- Python 3.8.18, pytest-8.2.1, pluggy-1.5.…

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性&#xff0c;适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…

可视化大屏,不搞点3D效果,感觉有点对不起观众呢。

使用3D模型可以为可视化展现增加更多的维度和真实感&#xff0c;提供更直观、生动的视觉效果。以下是一些3D模型在可视化展现中的作用&#xff1a; 增强沉浸感&#xff1a;通过使用3D模型&#xff0c;可以让观众感受到更真实的场景和物体&#xff0c;增强他们的沉浸感。这有助…

playwright相关的文章

霍格沃兹测试开发Muller老师 - 个人中心 - 腾讯云开发者社区-腾讯云 霍格沃兹测试开发Muller老师 &#xff1a;

【数组】Leetcode 452. 用最少数量的箭引爆气球【中等】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

golang问题

文章目录 Go里有哪些数据结构是并发安全的&#xff1f;int类型是并发安全的吗&#xff1f;为什么int不是并发安全的&#xff1f; Go如何实现一个单例模式&#xff1f;sync.Once是如何实现的&#xff0c;如何不使用sync.Once实现单例模式&#xff1f;Go语言里的map是并发安全的吗…

Freeswitch-Python3开发

文章目录 一、Freeswitch如何使用mod_python31.1 Freeswitch和python1.2 Freeswitch版本选择1.3 Freeswitch编译mod_python31.3.1 debian安装python31.3.2 Freeswitch编译mod_python31.3.3 加载 二、如何编写脚本2.1 函数的基本框架2.2 基本使用2.2.1 触发条件2.2.2 默认脚本位…