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 相关文章推荐
教你用eclipse连接mysql数据库
Apr 22 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
mysql5.7的安装及Navicate长久免费使用的实现过程
Nov 17 MySQL
mysql 获取时间方式
Mar 20 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 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语法(2)
2006/10/09 PHP
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
读jQuery之一(对象的组成)
2011/06/11 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
详解VSCode配置启动Vue项目
2019/05/14 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
pyramid配置session的方法教程
2013/11/27 Python
Python list操作用法总结
2015/11/10 Python
Python Requests安装与简单运用
2016/04/07 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python deque模块简单使用代码实例
2020/03/12 Python
python用700行代码实现http客户端
2021/01/14 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
银行实习生的自我评价
2013/12/09 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
岗位职责怎么写
2014/03/14 职场文书
物业品质提升方案
2014/06/08 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
学校社团活动总结
2015/05/07 职场文书
创业计划书之家政服务
2019/09/18 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript