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 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
浅谈MySQL next-key lock 加锁范围
Jun 07 MySQL
MySQL 开窗函数
Feb 15 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 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
模仿OSO的论坛(四)
2006/10/09 PHP
php str_replace的替换漏洞
2008/03/15 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
React 组件间的通信示例
2018/06/14 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
python 判断一个进程是否存在
2009/04/09 Python
简单介绍Python2.x版本中的cmp()方法的使用
2015/05/20 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
2020/09/03 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
职高毕业生自我鉴定
2013/10/21 职场文书
教师绩效考核方案
2014/01/21 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
单位活动策划方案
2014/08/17 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android
Python语言中的数据类型-序列
2022/02/24 Python