mysql 索引合并_MySQL 索引合并(Index Merge)优化

本文问题

什么是Index Merge?Index Merge的限制有哪些?

如何查看语句是否使用了Index Merger?

Index Merge有哪几种?分别适用于那些情景?

如何控制优化器是否使用Index Merge

Index Merge 索引合并

索引合并检索方法可以检索多个范围扫描并将结果合并。这种访问方法只能合并同一个表的索引扫描,不能合并跨表扫描。

合并可能生成基础扫描结果的"并集","交集",或者"交集的并集"

示例:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name

WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2

WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')

AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2

WHERE t1.key1 = 1

AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

Index Merge的已知缺陷

如果在WHERE语句中,存在多层嵌套的AND/OR,MySQL可能不会选择最优的方案,可以尝试通过拆分WHERE子句的条件来进行转换:

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

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

Index Merger不能应用于全文索引(fulltext index)

Index Merge的EXPLAIN输出

type列的值显示为index_merge

key列显示使用的索引列表

key_len列显示这些索引的最大长度(列表)。

Extra列显示Index Merge的算法:

Using intersect(...)

Using union(...)

Using sort_union(...)

mysql> explain select * from test_merge where (col1<10 and col2>50) or col3=50;

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+----------------------------------------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+----------------------------------------------+

| 1 | SIMPLE | test_merge | NULL | index_merge | idx_1_2,idx_3 | idx_1_2,idx_3 | 5,5 | NULL | 214 | 100.00 | Using sort_union(idx_1_2,idx_3); Using where |

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+----------------------------------------------+

1 row in set, 1 warning (0.00 sec)

mysql> explain select * from test_merge where (col1=10 and col2=50) or col3=50;

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+-----------------------------------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+-----------------------------------------+

| 1 | SIMPLE | test_merge | NULL | index_merge | idx_1_2,idx_3 | idx_1_2,idx_3 | 10,5 | NULL | 22 | 100.00 | Using union(idx_1_2,idx_3); Using where |

+----+-------------+------------+------------+-------------+---------------+---------------+---------+------+------+----------+-----------------------------------------+

1 row in set, 1 warning (0.00 sec)

Index Merge 算法

Index Merge Intersection 索引合并交集

这种方法适用于WHERE子句中的条件是通过AND结合的不同索引的范围条件时,其中的每个条件都需要满足下列条件之一:

如果其中的索引是多列索引,条件中需要包括索引的所有列

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

在Innodb表的主键上的范围条件

示例:

SELECT * FROM innodb_table

WHERE primary_key < 10 AND key_col1 = 20;

SELECT * FROM tbl_name

WHERE 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表主键索引条件,主键并不用来检索数据,而是用来筛选使用其他条件检索出的行。 # 就是先通过其他的范围条件筛选出一部分数据,在从这部分数据中,通过主键来筛选出最终的结果

Index Merge Union 索引合并并集

这种方法适用于WHERE子句中的条件是通过OR结合的不同索引的范围条件时,其中的每个条件都需要满足下列条件之一:

如果其中的索引是多列索引,条件中需要包括索引的所有列

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

在Innodb表的主键上的范围条件

适用于Index Merger intersection算法的条件

示例:

SELECT * FROM t1

WHERE key1 = 1 OR key2 = 2 OR key3 = 3;

SELECT * FROM innodb_table

WHERE (key1 = 1 AND key2 = 2)

OR (key3 = 'foo' AND key4 = 'bar') AND key5 = 5;

Index Merge Sort_Union

这种方法适用于WHERE子句中的条件是通过OR结合的不同索引的范围条件,但是不能使用Index Merge Union算法的情景

示例:

SELECT * FROM tbl_name

WHERE key_col1 < 10 OR key_col2 < 20;

SELECT * FROM tbl_name

WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

sort_union和union算法的区别是,sort_union必须在返回行数据前先获取行ID并对行ID进行排序。

禁用Index Merge

在optimizer_swith中有4个关于Index Merge的变量:

index_merge,index_merge_intersection,index_merge_union,index_merge_sort_union

默认情况下都是启用的。要单独启用某个算法,设置index_merge=off,并将相应的标志设置为on

问题答案

什么是Index Merge?Index Merge的限制有哪些?

如果查询中使用到了不同的索引,可以对不同索引的条件分别进行范围扫描,然后将扫描结果合并得到最终的结果,这就是Index Merge。

限制:只能合并同一个表的索引扫描结果,不能跨表合并。此外,无法对fulltext索引进行合并

如何查看语句是否使用了Index Merge?

EXPLAIN中type列的值为index_merge表示使用了索引合并。根据索引合并算法的不同,会在Extra列中显示Using intersect/union/sort_union

Index Merge有哪几种?分别适用于那些情景?

3种:Intersection,Union,Sort_union

Intersection:使用AND结合的关于不同索引的条件(普通索引的等值表达式或者主键索引的范围表达式)

Union和Sort Union:使用OR结合的关于不同索引的范围条件

区别:当条件为普通索引的等值表达式或者主键索引的范围表达式时,可以使用Union。其他不符合条件的只能使用Sort Union

如果包括多列索引,在范围条件中需要包括索引中的所有列。

如何控制优化器是否使用Index Merge

在optimizer_swith中有4个关于Index Merge的变量:

index_merge,index_merge_intersection,index_merge_union,index_merge_sort_union

默认情况下都是启用的。要单独启用某个算法,设置index_merge=off,并将相应的标志设置为on

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

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

相关文章

软件定义汽车带来的困境——如何破局?

目录 为什么软件定义汽车会掀起如此大的讨论热潮&#xff1f; 汽车软件的发展方向 软件开发商的挑战与机遇 近两年&#xff0c;关于汽车软件的讨论越来越多&#xff0c;国产替代的呼声也越来越高&#xff0c;软件定义汽车是业内非常火热的话题之一。 为什么软件定义汽车会掀起…

mysql中upper的用法_Oracle LOWER() 和 UPPER()函数的使用方法

Oracle LOWER() 和 UPPER()函数的使用方法一列返回行不区分大小写这是常见的做法&#xff0c;使列不区分大小写&#xff0c;以确保您所希望返回所有行。SELECT *FROM COURSESWHERE LOWER(education_delivery_method) classroom您可以使用Oracle的UPPER() or LOWER() 函数来在你…

FMI在仿真软件SkyEye中的应用

1.仿真技术的困境 随着科技的发展&#xff0c;我国在安全攸关领域对于嵌入式软件的应用日益广泛&#xff0c;并且对于软硬件的性能及可靠性等方面要求变得更高。面对各种复杂的系统设计所提供的设计和分析手段也逐渐完善&#xff0c;其中仿真技术在近几年越来越受到重视&#x…

mysql命令行cmd_CMD命令行操作MySQL

连接MySQL服务器&#xff1a;mysql -u用户名 -p密码mysql -u用户名 -pEnter Password:输入密码(无密码则直接回车)mysql -h主机名 -u用户名 -p密码 -D数据库名称退出&#xff1a;exit quit \q ctrlc显示帮助信息&#xff1a;\h取消本行命令&#xff1a;\c 取消当前…

c#ovalshape_【原创】C# 实现拖拉控件改变位置与大小(SamWang)(附源代码下载)

前言&#xff1a;很多时候我们需要在运行时&#xff0c;动态地改变控件的位置以及大小&#xff0c;以获得更好的布局。比如说实际项目中的可自定义的报表、可自定义的单据等诸如此类。它们有个特点就是允许客户或者二次开发人员设计它们需要的界面设置功能。本人以前也做过可自…

jmeter提取mysql数据_通过jmeter读取数据库数据,并取值作为请求的入参

为提升测试技能&#xff0c;督促自己学习。故写了这篇文章。测试小白一枚&#xff0c;最近感觉达到了自己认为的瓶颈期。总是有想法&#xff0c;想突破&#xff0c;但是无从入手。工具类用过fiddler、jmeter、charels、postman..大体接口测试工具&#xff0c;均多多少少使用过。…

如何快速上手mysql_mysql快速上手3

上一章给大家说的是数据库的视图&#xff0c;存储过程等等操作&#xff0c;这章主要讲索引&#xff0c;以及索引注意事项&#xff0c;如果想看前面的文章&#xff0c;url如下&#xff1a;索引简介索引是对数据库表中一个或多个列(例如&#xff0c;employee 表的姓名 (name) 列)…

mysql blob 好处_MySQL中的BLOB类型

一、概念&#xff1a;BLOB (binary large object)二进制大对象&#xff0c;是一个可以存储二进制文件的容器。在计算机中&#xff0c;BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB是一个大文件&#xff0c;典型的BLOB是一张图片或一个声音文件&#xff0c;由于它们的…

mysql group by null_MySQL无GROUP BY直接HAVING返回空的问题分析

有一张表&#xff0c;id是主键&#xff0c;这样的写法可以返回一条记录&#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMIN(id);”但是只是把MIN换成MAX&#xff0c;这样返回就是空了&#xff1a;复制代码 代码如下:“SELECT * FROM t HAVING idMAX(id);”这是为什…

c mysql 免安装版_MySQL5.6免安装版环境配置图文教程

MySQL是一个小巧玲珑但功能强大的数据库&#xff0c;目前十分流行。但是官网给出的安装包有两种格式&#xff0c;一个是msi格式&#xff0c;一个是zip格式的。很多人下了zip格式的解压发现没有setup.exe&#xff0c;面对一堆文件一头雾水&#xff0c;不知如何安装。下面小编将介…

python士兵突击_想自学Python进入该行业成为一名自己一直以来就很羡慕和钦佩的程序员,过来人的你有什么想分享的吗?...

多说无益就是干&#xff0c;学习编程也这样。我们下面主要通过以下三个步骤给出建议&#xff1a;1.确定目标(成为一个能干活的Python需要掌握哪些技能)。我们可以通过市面上对于Python工程师对招聘要求&#xff0c;去分析&#xff0c;具体需要掌握哪些内容。这个详细内容可以在…

启动项 mysql命令大全_mysql常用命令

一、登录mysql数据库1、连接本地mysql数据库,默认端口为3306#mysql –u root –p 123456 //-u&#xff1a;指定用户 -p&#xff1a;指定与用户对应的密码2、通过IP和端口连接远程mysql服务器#mysql –u root –p 123456 –h 192.168.100.1 –P 3306二、数据库操作语句1、显示所…

MDL锁导致mysql夯住_MySQL MetaData Lock 案例分享

前言&#xff1a;今天开发童鞋遇到一个奇怪的问题&#xff0c;在测试环境里面执行drop database dbname发现一直夯住不动&#xff0c;等了很久也没有执行&#xff0c;于是问题就到我这里了一、什么是MetaData Lock&#xff1f;MetaData Lock即元数据锁&#xff0c;在数据库中元…

ubuntu16 黑主题_给Ubuntu 8.10安装超炫酷黑色新主题

Linux系统的Netbook定做了一套漂亮的界面,名称叫做 HP Mini 1000 Mi Edition。这套界面是基于 Ubuntu 8.04 Hardy Heron的,平常我们熟悉的Ubuntu程序等都可以在这里都使用.不过让 Mi Edition 脱颖而出的是这看起来根本不像是我们平时看过的Ubuntu界面, 看上去倒像媒体中心。这个…

docker 分布式管理群集_Coolpy7分布式物联网MQTT集群搭建

Coolpy7分布式技术&#xff0c;支持多个Coolpy7 Core提供跨数据中心(多活)模式组建群集&#xff0c;支持群集零手动维护(基于Gossip分布式协议作为群集节点状态维护)。Coolpy7从版本号V7.3.2.3开始支持本功能。请到Coolpy7之github项目release下载相关版本https://github.com/C…

vue 数值 拼接字符串_【Vue原理】Compile - 白话版

写文章不容易&#xff0c;点个赞呗兄弟 专注 Vue 源码分享&#xff0c;文章分为白话版和 源码版&#xff0c;白话版助于理解工作原理&#xff0c;源码版助于了解内部详情&#xff0c;让我们一起学习吧 研究基于 Vue版本 【2.5.17】如果你觉得排版难看&#xff0c;请点击 下面链…

gpio驱动蜂鸣器出现破音_五款蜂鸣器驱动电路原理图

蜂鸣器驱动电路图一&#xff1a;典型的蜂鸣器驱动电路&#xff0c;蜂鸣器驱动电路一般包含&#xff1a;一个三极管、一个蜂鸣器、一个续流二极管、一个滤波电容。1、蜂鸣器&#xff1a;发声元件&#xff0c;在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声&am…

php和mysql的实践报告_PHP+MySQL项目开发与实践

前言部分基础篇任务一PHP基础知识简介1.1静态网页与动态网页的工作原理1.1.1静态网页与工作原理1.1.2动态网页与工作原理1.2初识PHP1.3习题任务二PHP程序的运行环境搭建2.1配置Apache服务器2.1.1安装Apache服务器2.1.2Apache服务器安装过程中的问题及解决方案2.1.3Apache主目录…

mediumint 在mysql 中是什么类型_mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围...

mysql数据库设计&#xff0c;其中&#xff0c;对于数据性能优化&#xff0c;字段类型考虑很重要&#xff0c;搜集了些资料&#xff0c;整理分享出来&#xff0c;这篇为有关mysql整型bigint、int、mediumint、smallint 和 tinyint的语法介绍&#xff0c;如下&#xff1a;1、bigi…

mysql备份还原数据库操作系统_mysql 命令行备份还原数据库操作

一 备份操作1.备份全部数据库mysqldump -uroot -p --all databases > aa.sql2.备份某个数据库并压缩mysqldump -uroot -p databasename |gzip > aa.sql.gz3 .备份单个表mysqldump -uroot -p -table dbname tbname1 tbname2 >aa.sql4.同时备份多个数据库mysqldump -ur…