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 InnoDB存储引擎的内存管理
Apr 08 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
MySQL日期时间函数知识汇总
Mar 17 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 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查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
PHP array_multisort() 函数的深入解析
2013/06/20 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
php检测文本的编码
2015/07/26 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
bootstrap表单示例代码分享
2017/05/18 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
Angular4 ElementRef的应用
2018/02/26 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
python使用SQLAlchemy操作MySQL
2020/01/02 Python
python 实现批量图片识别并翻译
2020/11/02 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
Linux如何为某个操作添加别名
2013/03/01 面试题
什么是设计模式
2012/06/17 面试题
自荐信格式简述
2014/01/25 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
年终奖发放方案
2014/06/02 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
2014财务年终工作总结
2014/12/08 职场文书
2015年领班工作总结
2015/04/29 职场文书
SQL Server数据定义——模式与基本表操作
2021/04/05 SQL Server
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android