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 08 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
新手入门Mysql--sql执行过程
Jun 20 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 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
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
分享php分页的功能模块
2015/06/16 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
php之可变变量的实例详解
2017/09/12 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP实现倒计时功能
2020/11/16 PHP
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
jquery获取radio值实例
2014/10/16 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
判断单链表中是否存在环
2012/07/16 面试题
关于毕业的广播稿
2014/01/10 职场文书
采购意向书范本
2014/03/31 职场文书
学习方法演讲稿
2014/05/10 职场文书
机电专业求职信
2014/06/14 职场文书
授权委托书格式范文
2014/08/02 职场文书
门面房租房协议书
2014/08/20 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
通报表扬范文
2015/01/17 职场文书
居委会工作总结2015
2015/05/18 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
一文搞懂Java中的注解和反射
2022/06/21 Java/Android
create-react-app开发常用配置教程
2022/06/25 Javascript
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript