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多表查询-笔记七
Apr 05 MySQL
MySQL 查询速度慢的原因
May 25 MySQL
MySQL 不等于的三种使用及区别
Jun 03 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
MySQL 计算连续登录天数
May 11 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
PHP程序员编程注意事项
2008/04/10 PHP
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
如何使用php实现评委评分器
2015/07/31 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
javascript下过滤数组重复值的代码
2007/09/10 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
浏览器兼容的JS写法总结
2016/04/27 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
读懂CommonJS的模块加载
2019/04/19 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
Python break语句详解
2014/03/11 Python
django用户登录和注销的实现方法
2018/07/16 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
北京振戎融通Java面试题
2015/09/03 面试题
幼儿园毕业家长感言
2014/02/10 职场文书
挂牌仪式主持词
2014/03/20 职场文书
诚信考试倡议书
2014/04/15 职场文书
职位说明书范文
2014/05/07 职场文书
万能检讨书
2015/01/27 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
Windows Server 2019 安装DHCP服务及相关配置
2022/04/28 Servers