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 query_cache_type 参数与使用详解
Jul 01 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL的InnoDB存储引擎的数据页结构详解
Mar 03 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MYSQL如何查看操作日志详解
May 30 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
MySQL索引失效十种场景与优化方案
May 08 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
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
php 模拟get_headers函数的代码示例
2013/04/27 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
JavaScript 特殊字符
2007/04/05 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
jquery三个关闭弹出层的小示例
2013/11/05 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
js date 格式化
2017/02/15 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python常用的json标准库
2019/02/19 Python
Python使用贪婪算法解决问题
2019/10/22 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
初中体育教学反思
2014/01/14 职场文书
校本教研工作制度
2014/01/22 职场文书
优秀食品类广告词
2014/03/19 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
建材投资建议书
2014/05/16 职场文书
护校行动方案
2014/05/31 职场文书
公务员政审个人总结
2015/02/12 职场文书