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 如何分析查询性能
May 12 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 MySQL
ORM模型框架操作mysql数据库的方法
Jul 25 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 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
下载文件的点击数回填
2006/10/09 PHP
php获取图片信息的方法详解
2015/12/10 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
浅析JS中对函数function的理解(基础篇)
2016/10/14 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
详解vue-cli 脚手架 安装
2019/04/16 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
[00:58]他们到底在电话里听到了什么?
2017/11/21 DOTA
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
python模块如何查看
2020/06/16 Python
Pygame框架实现飞机大战
2020/08/07 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
女方回门宴答谢词
2014/01/14 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
服务理念标语
2014/06/18 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
运动会口号霸气押韵
2015/12/24 职场文书
讲解MySQL增删改操作
2022/05/06 MySQL
MySQL数据库之存储过程 procedure
2022/06/16 MySQL