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

8.2.1.3 索引合并优化

索引合并访问方法检索具有多个范围扫描的行,并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描,而不是跨多个表的扫描。合并可以生成其基础扫描的合并、交叉或交叉的合并。

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

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);

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

  • 如果您的查询有一个复杂的 WHERE 子句,带有深度 AND/OR 嵌套,并且 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 输出中,索引合并方法在 type 列中显示为 index_merge 。 在本例中,key 列包含使用的索引列表,key_len 包含这些索引的最长键部分列表。

索引合并访问方法有几种算法,显示在 EXPLAIN 输出的 Extra 字段中:

  • 使用 intersect(...)
  • 使用 union(...)
  • 使用 sort_union(...)

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

  • 索引合并交叉访问算法
  • 索引合并合并访问算法
  • 索引合并排序合并访问算法
  • 影响索引合并优化

索引合并交叉访问算法

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 字段中使用索引)。下面是这样一个查询的示例:

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

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

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

索引合并合并访问算法

该算法的标准与索引合并交叉算法的标准相似。当将表的 WHERE 子句转换为不同键上的多个范围条件并结合 OR 时,该算法适用,并且每个条件都是以下条件之一:

  • 此形式的 N 部分表达式,其中索引正好有 N 个部分(即覆盖所有索引部分):
  • InnoDB 表主键上的任何范围条件。
  • 索引合并交叉算法适用的条件。

示例:

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;

索引合并排序合并访问算法

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 ,并在返回任何行之前对它们进行排序。

影响索引合并优化

索引合并的使用取决于 optimizer_switch 系统变量的 index_mergeindex_merge_intersectionindex_merge_union 、和 index_merge_sort_union 标志的值。参见 第 8.9.2 节 “可切换优化” 。默认情况下,所有这些标志都处于启用状态。若要仅启用某些算法,请将 index_merge 设置为禁用,并仅启用应允许的其他算法。

除了使用 optimizer_switch 系统变量控制优化器在会话范围内使用索引合并算法之外,MySQL 还支持优化器提示,以按语句影响优化器。参见 第 8.9.3 节“优化器提示” 。

相关文章:

8.2.1.3 索引合并优化

索引合并访问方法检索具有多个范围扫描的行&#xff0c;并将其结果合并为一个。此访问方法仅合并来自单个表的索引扫描&#xff0c;而不是跨多个表的扫描。合并可以生成其基础扫描的合并、交叉或交叉的合并。 可以使用索引合并的查询示例&#xff1a; SELECT * FROM tbl_name…...

水雨情在线小能手-雨量水位报警站

雨量水位报警站由水位探测器、雨量传感器、报警灯、扩音器、太阳能板和采集传输控制器组成。实时采集水位等级&#xff0c;三个水位探测器对应3个水位等级&#xff0c;当现场水面浸没相应探测器时&#xff0c;本机会实时发出语音报警&#xff0c;同时可发送相应的预警/报警等级…...

【蓝桥杯集训4】双指针专题(6 / 6)

目录 3768. 字符串删减 - 滑动窗口ac 799. 最长连续不重复子序列 - 滑动窗口 800. 数组元素的目标和 - 二分ac 2816. 判断子序列 - 双指针 1238. 日志统计 - 滑动窗口 1240. 完全二叉树的权值 - 双指针 1、前缀和 - 通过了 5/12个数据 2、双指针 3768. 字符串删减 -…...

文件流,gzip解压,压缩

目录 文件画布 写入 &#xff08;空文件Foutnew File(Parent,entry.getName());&#xff09;FileOutputStream outnew FileOutputStream(Fout);BufferedOutputStream Boutnew BufferedOutputStream(out);其他流量基于基础包装文件--文件流---字节流 顺序pbf一般是形成后再压缩目…...

在线开会,来开开圆桌会议吧~

圆桌会议应用场景&#xff1a;适合内部培训、部门会议亦或是头脑风暴等较为轻松的场景&#xff0c;有兴趣的朋友可以联系我来测试哦~~ 上图&#xff1a; 图&#xff1a;圆桌会议应用截图 在圆桌布局之下&#xff0c;企业可以将每一位参会者和座位绑定&#xff0c;1:1模拟线下圆…...

使用营销自动化的 7 大主要优势

对于大多数企业家来说&#xff0c;自动化已成为在数字时代简化业务的必要条件。那么&#xff0c;您可以采取哪些步骤来实施营销自动化呢&#xff1f; 1. 社交媒体整合 拥有吸引人的社交媒体形象是成功的先决条件。您不可能完成所有社交媒体营销任务&#xff0c;使用自动化软件&…...

【图像分类】基于PyTorch搭建GRU实现MNIST手写数字体识别(单/双向GRU,附完整代码和数据集)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 在https://blog.csdn.net/AugustMe/article/details/128969138文章中,我们使用了基于PyTorch搭建LSTM实现MNIST手…...

day14_oop_抽象_接口

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、抽象 三、接口 零、 复习昨日 多态的好处: 扩展性强.加入新的功能,不需要改动代码降低代码耦合度(解耦合或者松耦合) 一、抽象类 1.1 抽象类…...

模式识别 | MATLAB实现DNN深度神经网络模式分类识别

分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测 目录 分类预测 | MATLAB实现DNN全连接神经网络多特征分类预测基本介绍任务描述程序设计参考资料基本介绍 DNN的结构不固定,一般神经网络包括输入层、隐藏层和输出层,一个DNN结构只有一个输入层,一个输出层,输入层和输…...

【C++】类和对象三大特性--继承

文章目录1.继承的概念及定义1.1继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6. 继承与静态成员7.复杂的菱形继承及菱形虚拟继承虚拟继承解决数…...

MySQL的存储引擎

目录 一.概念 二.分类 操作 修改默认存储引擎 一.概念 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不…...

工程项目管理系统源码-简洁+好用+全面-工程项目管理系统

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 ​系统定义 工程项目管理企业不直接与该工程项目的总承…...

什么是STAR原则?

文章目录&#x1f4cb;前言&#x1f525;省流版&#x1f3af;什么是STAR原则&#x1f3af;进行过程&#x1f4cb;前言 对于大部分还在学习阶段的学生们来说&#xff0c;可能并不了解这个原则的含义&#xff0c;这里的star并不是指英文单词星星。这个原则我也是前段时间才认识到…...

前置知识-初值问题、显式隐式龙格库塔方法、Butcher阵列

1.1.4 龙格一库塔法 将向前欧拉法写成式 (1-37) 的形式, 可以看出它实际上利用了 f ( x , u ) f(x, u) f(x,u) 在 x n...

PythonWeb Django PostgreSQL创建Web项目(二)

安装数据库PostgreSQL并创建数据库 我第一次尝试使用PostgreSQL数据库&#xff0c;why&#xff1f;我喜欢它提供的丰富的数据类型&#xff0c;例如货币类型、枚举类型、几何类型(点、直线、线段、矩形等等)、网络地址类型、文本搜索类型、XML类型JSON类型等等&#xff0c;非常…...

Python学习笔记:使用字符串

使用字符串 使用字符串格式&#xff1a;精简版 百分号 % # 指定要设置其格式的值时&#xff0c;可使用单个值&#xff08;如字符串或数字&#xff09;&#xff0c;可使用元组&#xff08;如果要设置多个值得格式&#xff09;&#xff0c;还可使用字典 >>> format …...

echarts饼图封装

1. 组件 <template> <div :id"id" class"main" :style"{ width: width, height: height }" :ref"id" ></div> </template> <script> import * as echarts from "echarts"; export default { …...

Web3.0 教学基础一

目录 什么是web3.0 Web 1.0 概念 Web 2.0 概念 Web 3.0 概念 Web 3.0 的优势 什么是DAPP 什么是web3.0 在了解web3.0之前我们需要了解下前面的web1.0与web2.0。 Web 1.0 概念 Web1.0是万维网最初的版本&#xff0c;而静态网站则被认为是全网Web 1.0的起源&#xff0c;用…...

body使用渐变色无效的原因之一:html没有设置高度

直接在css文件中对body设置渐变色&#xff1a; body {height: 100%;background: -webkit-linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);background: -moz-linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%);background: -o-linear-gradient(120deg, #a1c4fd 0%, #c2e…...

Python3 函数实例及演示

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。我们已经知道Python提供了许多内建函数&#xff0c;比如print()。但也可以自己创建函数&#xff0c;这被叫做用户…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...