mysql 索引合并的使用


Posted in MySQL onAugust 30, 2021

索引合并是mysql底层为我们提供的智能算法。了解索引合并的算法,有助于我们更好的创建索引。

索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的。仅合并来自单个表的索引扫描,而不是跨多个表的索引扫描。合并会产生底层扫描的三种形式:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并)。

以下四个例子会产生索引合并:

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

索引合并有以下已知的局限性:

1、如果查询语句包含一个带有严重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)

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

在 EXPLAIN 语句输出的信息中,索引合并在type列中表现为“index_merge”,在这种情况下,key列包含使用的索引列表。
索引合并访问方法有几种算法,表现在 EXPLAIN 语句输出的Extra字段中:

Using intersect(...)
Using union(...)
Using sort_union(...)

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

Index Merge Intersection算法

Index Merge Intersection算法对所有使用的索引执行同步扫描,并生成从合并的索引扫描接收到的行序列的交集。
这种算法适用于当WHERE子句被转换成多个使用AND连接的不同索引key上的范围条件,且条件是以下两种之一:

一、这种形式的N部分表达式,索引正好包括N个字段(所有索引字段都被覆盖),N>=1,N如果大于1就是复合索引:

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;

Index Merge Union算法

该算法类似于Index Merge Intersection算法,适用于当WHERE子句被转换成多个使用OR连接的不同索引key上的范围条件,且条件是以下三种之一:

一、这种形式的N部分表达式,索引正好包括N个字段(所有索引字段都被覆盖),N>=1,N如果大于1就是复合索引:

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

二、InnoDB表主键上的任何范围条件。
三、符合Index Merge 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连接的不同索引key上的范围条件,但是不符合 Index Merge Union算法的。Index Merge Sort-Union和Index Merge Union算法的区别在于,Index Merge Sort-Union必须首先获取所有行的行id并在返回任何行之前对它们进行排序。

例子:

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;

到此这篇关于mysql 索引合并的使用的文章就介绍到这了,更多相关mysql 索引合并内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

MySQL 相关文章推荐
详解mysql三值逻辑与NULL
May 19 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
通过shell脚本对mysql的增删改查及my.cnf的配置
Jul 07 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
MySql重置root密码 --skip-grant-tables
Apr 11 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 #MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 #MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 #MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 #MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 #MySQL
MySQL非空约束(not null)案例讲解
Aug 23 #MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 #MySQL
You might like
sphinx增量索引的一个问题
2011/06/14 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
json 实例详细说明教程
2009/10/31 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
Python生成随机数的方法
2014/01/14 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
2014年科室工作总结范文
2014/12/19 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript