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字符串截取函数小结
Apr 05 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
Jul 25 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
MySQL数据库完全卸载的方法
Mar 03 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 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
MyEclipse常用配置图文教程
2014/09/11 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
JS date对象的减法处理实现代码
2010/12/28 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
jQuery zTree 异步加载添加子节点重复问题
2017/11/29 jQuery
npm scripts 使用指南详解
2018/10/08 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
详解vue路由
2020/08/05 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
python自动zip压缩目录的方法
2015/06/28 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
深入浅析python 中的匿名函数
2018/05/21 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
pandas分组聚合详解
2020/04/10 Python
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
医学生实习自荐信
2013/10/01 职场文书
交通事故协议书范文
2014/04/16 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
先进个人主要事迹范文
2015/11/04 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis