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 07 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
一文读懂navicat for mysql基础知识
May 31 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
mysql的数据压缩性能对比详情
Nov 07 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
mysql查看表结构的三种方法总结
Jul 07 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中Session的概念
2006/10/09 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
jquery json 实例代码
2010/12/02 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
Vue.js中该如何自己维护路由跳转记录
2019/05/19 Javascript
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
高三自我鉴定
2013/10/23 职场文书
日语系毕业生推荐信
2013/11/11 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
贷款担保申请书
2014/05/20 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
天那边观后感
2015/06/09 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
小学四年级作文之写景
2019/08/23 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
关于Python使用turtle库画任意图的问题
2022/04/01 Python