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 相关文章推荐
数据库连接池
Apr 06 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
MySQL8.0.18配置多主一从
Jun 21 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
排查并解决MySQL生产库内存使用率高的报警
Apr 11 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL主从切换的超详细步骤
Jun 28 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
php4的session功能评述(二)
2006/10/09 PHP
php &amp;&amp; 逻辑与运算符使用说明
2010/03/04 PHP
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
smarty学习笔记之常见代码段用法总结
2016/03/19 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
Laravel实现通过blade模板引擎渲染视图
2019/10/25 PHP
Javascript 布尔型分析
2008/12/22 Javascript
Wordpress ThickBox 点击图片显示下一张图的修改方法
2010/12/11 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
Angular 4根据组件名称动态创建出组件的方法教程
2017/11/01 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
用Python将结果保存为xlsx的方法
2019/01/28 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
企业管理专业个人求职信范文
2013/09/24 职场文书
委托书模板
2014/04/04 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
2015暑假社会调查报告
2015/07/13 职场文书