当前位置: 首页 > news >正文

【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还支持优化器提示,以在每条语句的基础上影响优化器。

参见“优化器提示”。
 

相关文章:

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

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(2)-范围查询优化-CSDN博客 下一篇&#xff1a; 目录 1.索引合并-交集访问算法 2.索引合并联合访问算法 3.索引合并-排序联合访问算法 4.影响索引合…...

Linux中安装配置并使用samba服务(Centos以及Ubuntu)

目录 前言1. 基本知识2. Centos3. Ubuntu3.1 物理服务器3.2 云服务器前言 在window与linux系统中配置一个共享文件夹,可以做很多时间,比如映射器或者像linux中定时存放文件等 1. 基本知识 在Ubuntu上安装和配置Samba服务可以让你的Ubuntu机器与Windows、macOS以及其他Linu…...

three.js能实现啥效果?看过来,这里都是它的菜(06)

这是第五期了&#xff0c;本期继续分享three.js可以实现的3D动画案例&#xff0c;有老铁反馈再发案例的时候&#xff0c;是否可以顺道分享一下three.js的知识点&#xff0c;好吧&#xff0c;安排。 材质动画 材质动画可以实现各种复杂的视觉效果&#xff0c;包括但不限于以下…...

利用ESP32-C3将TF卡内容变成U盘进行读取

利用ESP32-C3将TF卡内容变成U盘进行读取 ESP32-C3是一款高性价比的微控制器&#xff0c;具备WiFi和蓝牙功能&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;项目中。除了常见的无线通信功能外&#xff0c;ESP32-C3还可以用来模拟U盘读取TF卡内容。本文将介绍如何通过…...

C++小病毒

C小病毒&#xff08;注&#xff1a;对电脑无过大伤害&#xff09; 短短行&#xff0c;创造奇迹&#xff01; 把这个文件命名为virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…...

使用VUE3+TS+elementplus创建一个增加按钮

一、前言 在上一篇文章中分享了创建table的过程&#xff0c;详见&#xff08;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff09;&#xff0c;本文在创建好的table的基础上&#xff0c;再创建一个增加按钮。 二、程序展示 1、前面创建table的程序 <templ…...

Python面试宝典:文件读写和上下文管理器以及输入输出流面试题(1000加python面试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第一部分:Python基础:第八章:文件操作和输入输出:第一节:文件读写和上下文管理器以及输入输出流】 第八章:文件操作和输入输出第一节:文件读写和上下文管理器以及输入输出流1.1、文件读写基本操作1.1.1、打开…...

Spring Boot | Spring Boot 实现 “记住我“ 功能

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 )二、实现 "记住我" 功能 ( 通过 "HttpSecurity类" 的 rememberMe( )方法来实现 "记住我" 功能 ) :2.1 基于 "简单加密 Token" 的方式 ( 实现 "记住我&…...

AGM AG32 MCU替代GD32F407/STM32F407的手持示波器方案

一、AG32 MCU替代GD32F407/STM32F407的数字示波器方案 市场上有多款数字迷你示波器&#xff0c;特别小巧&#xff0c;携带非常方便。单通道&#xff0c;标注100Mhz带宽&#xff0c;500MS采样率。 这样高的采样率需要使用高速AD及很高性能的处理器。原方案使用AD9288双通道8bit …...

MongoDB基础入门到深入(八)MongoDB整合SpringBoot、Chang Streams

文章目录 系列文章索引十五、MongoDB整合SpringBoot1、环境准备2、集合操作3、文档操作&#xff08;1&#xff09;相关注解&#xff08;2&#xff09;创建实体&#xff08;3&#xff09;添加文档&#xff08;4&#xff09;查询文档&#xff08;5&#xff09;更新文档&#xff0…...

linux下的nfs概述与实验(openEuler22.03)

目录 什么是NFSNFS工作原理NFS常用文件/etc/exports文件/etc/exports格式 /var/lib/nfs/etab文件 NFS常用选项NFS配置方式1. 安装NFS和RPC2. 启动rpcbind和nfs3. 准备目录4. 配置/etc/exports并重启服务5. 连接测试服务端自我测试客户端测试 补充常用命令永久挂载注意 什么是NF…...

影响Oracle数据库打开速度的因素

当Oracle发起一个事务需要更改数据时&#xff0c;如果所涉及的数据块不在BUFFER CACHE中&#xff0c;那么Oracle服务进程首先会将相关数据块从数据文件中读进BUFFER CACHE进行更改&#xff08;直接路径读除外&#xff09;&#xff0c;更改后的数据块称之为脏块&#xff08;DIRT…...

dify:开源 LLMOps平台。

单纯笔记&#xff1a; 一、关于 Dify dify/README_CN.md at main langgenius/dify GitHub Dify 是一款开源的大语言模型&#xff08;LLM&#xff09;应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以…...

CCF20220601——归一化处理

CCF20220601——归一化处理 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a[1000],sum0;scanf("%d",&n);for(int i1;i<n;i){scanf("%d",&a[i]);suma[i];}double aver1.0,b0.0,d1.0;aversum/(n*1…...

用Ai编写一个电机驱动程序

问&#xff1a;帮我写一个步进电机的控制程序&#xff0c;要有包括加减速&#xff0c;以及电机步中断处理函数。 答&#xff1a;编写一个步进电机的控制程序涉及到硬件层面的操作&#xff0c;通常需要依赖特定的硬件平台和相应的驱动程序。以下是一个简化的示例&#xff0c;它展…...

【C++入门】—— C++入门 (下)_内联函数

前言&#xff1a;在了解完前面的C基础内容后&#xff0c;马上我们就要真正不如C的学习了&#xff0c;但在之前让我们最后了解最后一点点C入门知识&#xff01;来迟的520特别篇&#xff01; 本篇主要内容&#xff1a; 内联函数 auto关键字 范围for 指针空值nullptr C入门 1. 内联…...

Java数据结构与算法(最小栈)

前言 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…...

7 Series FPGAs Integrated Block for PCI Express IP核 Advanced模式配置详解(三)

1 TL Settings Transaction Layer (TL)设置只在Advanced模式下有效。 Endpoint: Unlock and PME_Turn_Off Messages: 与端点的电源管理相关&#xff0c;允许发送解锁和电源管理事件关闭消息。 Root Port: Error Messages: Error Correctable&#xff08;错误可纠正&#xff09…...

k8s 部署mqtt简介

在Kubernetes&#xff08;K8s&#xff09;中部署MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服务通常涉及以下几个步骤&#xff1a; 选择MQTT Broker MQTT Broker是MQTT消息传递的中间件。流行的MQTT Broker包括Mosquitto, HiveMQ, EMQ X等。你需要选择一…...

汇凯金业:量化交易中常用的数学模型有哪些

量化交易中运用了多种数学模型来识别市场的潜在机会和建立交易策略。以下是一些在量化交易中常用的数学模型&#xff1a; 1. 时间序列分析模型 时间序列分析是研究和预测数据点随时间顺序变化趋势的方法。在量化交易中&#xff0c;常用的时间序列模型包括&#xff1a; 自回归&a…...

Neuralink脑机接口技术解析:从医疗应用到人机共生

1. 项目概述&#xff1a;从科幻到现实的神经接口革命最近几年&#xff0c;一个名字频繁出现在科技和医疗的交叉领域&#xff0c;引发无数讨论与遐想——Neuralink。这不仅仅是一家公司的名字&#xff0c;它更像是一个时代的符号&#xff0c;代表着人类试图用最前沿的工程技术&a…...

别再装ModelSim了!用HDLBits网页版5分钟搞定Verilog仿真和波形图

5分钟极速验证&#xff1a;用HDLBits网页版替代传统Verilog仿真工具 在图书馆公用电脑上突然有了个FPGA设计灵感&#xff0c;却发现自己没装ModelSim&#xff1f;公司电脑没有管理员权限&#xff0c;无法安装Vivado Simulator&#xff1f;别急着放弃——打开浏览器&#xff0c…...

Wedding-website图片库与相册功能:展示精美婚礼照片的最佳实践

Wedding-website图片库与相册功能&#xff1a;展示精美婚礼照片的最佳实践 【免费下载链接】wedding-website Our Wedding Website &#x1f46b; 项目地址: https://gitcode.com/gh_mirrors/we/wedding-website 婚礼是人生中最珍贵的时刻之一&#xff0c;而如何将这些美…...

论文AI率爆表怕延毕?5招实测降AI率,3分钟知网AIGC过审上岸

2025 年 12 月 25 日知网 AIGC 检测系统升级&#xff0c;2026 年 4 月 27 日维普 AI 率检测平台升级…2026 毕业季&#xff0c;各大主流 AIGC 检测软件陆续升级系统&#xff0c;识别 AI 痕迹更加精准。 临近毕业&#xff0c;同学们看者飘红的 AIGC 检测报告、纷繁复杂的降 AI …...

开源鸿蒙OpenHarmony在微纳卫星上的航天级改造与应用实践

1. 项目概述&#xff1a;当开源鸿蒙“遇见”微纳卫星最近在航天圈里有个挺有意思的事儿&#xff0c;开源鸿蒙OpenHarmony系统&#xff0c;就是咱们手机、平板上那个鸿蒙系统的开源版本&#xff0c;现在已经成功“上天”了。这事儿不是概念验证&#xff0c;而是实打实地应用在了…...

【仅剩72小时】ElevenLabs希腊文语音v2.4.1热更新前瞻:首次支持Cypriot方言变体,附迁移兼容性速查表

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;ElevenLabs希腊文语音v2.4.1热更新核心概览 ElevenLabs v2.4.1 版本针对希腊文&#xff08;Greek&#xff09;语音合成能力进行了深度热更新&#xff0c;显著提升了音素对齐精度、语调自然度及方言兼容性。本…...

Captain AI:Ozon俄文内容本地化,打破语言壁垒,贴合本土需求

俄文内容本地化是Ozon商家立足俄罗斯市场的核心前提&#xff0c;Ozon平台95%以上的用户为俄语母语者&#xff0c;纯中文或机翻的内容不仅会导致搜索曝光降低&#xff0c;还可能因语言错误引发合规风险、影响买家信任。然而&#xff0c;国内商家普遍面临“俄语专业人才短缺、机翻…...

聊一聊5家软件许可优化公司,哪个更适合你?

做软件资产管理的朋友应该都有同感&#xff1a;软件许可这事儿&#xff0c;水太深了。尤其这几年大厂审计越来越狠&#xff0c;一不小心就是几百万的罚单。所以很多公司开始找专门做软件许可优化的服务商。今天聊聊5家比较有代表性的&#xff1a;、Flexera、Snow、Anglepoint和…...

Linux 进程从入门到实战(一)

.个人主页&#xff1a;晓风飞专栏&#xff1a;数据结构|Linux|C语言路漫漫其修远兮&#xff0c;吾将上下而求索文章目录进程为什么要存在内存&#xff1f;&#xff1f;操作系统进程什么是进程&#xff1f;PCB&#xff08;进程控制块&#xff09;操作系统如何管理进程&#xff1…...

河南话TTS项目踩坑实录:为什么你的“中”字总发成“zōng”?——基于127小时方言语料的韵律建模纠偏指南

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;河南话TTS项目踩坑实录&#xff1a;为什么你的“中”字总发成“zōng”&#xff1f; 在构建河南方言语音合成&#xff08;TTS&#xff09;系统时&#xff0c;我们发现一个高频且顽固的问题&#xff1a;标准普通…...