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 05 MySQL
MySQL表的增删改查基础教程
Apr 07 MySQL
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
Mysql中存储引擎的区别及比较
Jun 04 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
一文解答什么是MySQL的回表
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截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
浅谈php命令行用法
2015/02/04 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
jQuery使用手册之三 CSS操作
2007/03/24 Javascript
javascript动态添加表格数据行(ASP后台数据库保存例子)
2010/05/08 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python简单猜数游戏实例
2015/07/09 Python
玩转python爬虫之正则表达式
2016/02/17 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
遗体告别仪式答谢词
2014/01/23 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
银行贷款承诺书
2014/03/29 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
垂直极限观后感
2015/06/08 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书