MySQL中Index Merge简介
索引合并优化
官网翻译
MySQL5.7文档 索引合并是为了减少几个范围(type中的range类型:range can be used when a key column is compared to a constant using any of the =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, or IN() operators:)扫描的行数,并将他们的结果合并成一个。这里的合并可能是, 他们的并集、交集或者几个交集后的并集。这种索引的合并只能合并一个表中的索引扫描;而不能合并 多个表种的范围扫描。
在explain的输出中,索引合并将会在type列出现,显示为index merge。在这种case中,key列包含合并的索引的 一个列表,并且key_len列包含这些索引中最长的key的部分。
例如:
索引合并方法有几种合并算法(见explain输出的extra列)
- Using intersect(...)
- Using union(...)
- Using sort_union(...)
下面的小节会更详细的介绍这些算法。
注意
索引合并算法有以下已知的缺陷
如果你的查询使用的是一个带有多层and/or嵌套的复杂where子句, MySQL就不会选择这个优化策略了,你可以尝试使用一下规则来拆分他们:
索引合并还不能应用到全文检索上。但未来的MySQL版本可能会支持
具体是使用索引合并优化,还是其他的优化方法?MySQL要根据他的代价估算模型来决定。
1. 通过Intersection算法合并索引
这个算法会被使用,当where子句可以被转换为几个排列情况,使用and来组合不同的key,并且每一个组合都要下面的一种:
在这种形式中,索引要有确切的N部分(即,所有的索引列都要覆盖)
key_part1=const1 AND key_part2=const2 ... AND key_partN=constN
InnoDB表中主键的任何范围条件
例如:
这个Intersection合并索引算法会同时扫描所有使用索引,并产出:(合并的索引)(所扫描的行序列)的交集。
如果要查询的所有的列都在被合并的索引上,就不会扫描表中的所有列了(即被索引覆盖了,在explain的输出 中在extra列就会显示Using index)。下面是一个例子:
如果使用的索引没有覆盖所有的查询列,就会根据具体条件回表查询全部的数据行列了。
If one of the merged conditions is a condition over a primary key of an InnoDB table, it is not used for row retrieval, but is used to filter out rows retrieved using other conditions.
2. 通过Union算法合并索引
这个算法的使用条件和Intersection算法差不多。这个算法使用到,where子句可以别转换为使用or来组合 不同的key,并且每一个组合都要下面的一种:
在这种形式中,索引要有确切的N部分(即,所有的索引列都要覆盖)
key_part1=const1 AND key_part2=const2 ... AND key_partN=constN
InnoDB表中主键的任何范围条件
索引合并的intersect算法能使用的情况也行
例如:
3. 通过sort_union算法合并索引
这中算法会在,使用or来排列条件,但是union算法又不适用的情况
例如:
sort_union算法和union算法的不同之处在于:sort_union算法在返回结果之前必须获得所有行的行ID,并且将他们排序。
[1]:[http://www.tuicool.com/articles/eyURR3r]
[2]:[http://www.orczhou.com/index.php/2013/01/mysql-source-code-query-optimization-index-merge/]
[3]:[http://dev.mysql.com/doc/refman/5.7/en/index-merge-optimization.html]
MySQL中Index Merge简介的更多相关文章
- MySQL中的索引简介
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...
- MySQL中index和key的关系
KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY ...
- mysql中常用函数简介(不定时更新)
常用函数version() 显示当前数据库版本database() 返回当前数据库名称user() 返回当前登录用户名inet_aton(IP) 返回IP地址的数值形式,为IP地址的数学计算做准备in ...
- mysql中index与Multiple-Column Indexes区别与联系
索引对提升SELECT/UPDATE语句查询速度有着立竿见影的效果,有索引和无索引,查询速度往往差几个数量级. 本次讨论一下index(每列作为一个索引,单列索引)和Multiple-Column I ...
- MySQL 中Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化
一.ICP优化原理 Index Condition Pushdown (ICP),也称为索引条件下推,体现在执行计划的上是会出现Using index condition(Extra列,当然Extra ...
- MySQL中Index Condition Pushdown(ICP)优化
在MySQL 5.6开始支持的一种根据索引进行查询的优化方式.之前的MySQL数据库版本不支持ICP,当进行索引查询是,首先根据索引来查找记录,然后在根据WHERE条件来过滤记录.在支持ICP后,My ...
- mysql中key 、primary key 、unique key 与index区别
一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id ) NOT NULL auto_increment, ) default NU ...
- MySQL 中 key, primary key ,unique key,index的区别
一.key与primary key区别 CREATE TABLE wh_logrecord ( logrecord_id int(11) NOT NULL auto_increment, user_n ...
- MySQL中的索引优化
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...
随机推荐
- OSGi教程:Resource API Specification
此教程基于OSGi Core Release 7 OSGi Resource API规范 详细内容上面英文教程有详细解答 下面主要是一些个人见解,若有不当之处,欢迎指出: Resource:就是能够被 ...
- ThinkPHP中_after_update、_before_update等的用法
https://blog.csdn.net/aslackers/article/details/50339163 TP系统\Think\Model类里隐藏了几个有用的方法: _before_inser ...
- poj2449第K短路问题(A*算法)
启发函数:f(x)=g(x)+h(x); g(x)表示初始点到x状态的代价,h(x)表示从x的状态到目标状态的代价的估计值(并不是真实的),实际最小代价<=h(x); 起点s,终点t,x.v=s ...
- jdbc知识点(连接mysql)
jdbc连接mysql 1.JDBC简介 JDBC: 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库.从根本上来说,JDBC ...
- JavaScript--微博发布效果
效果图: 实现思路: 当发布按钮被点击时,又会分为三种情况 1.如果输入的内容为空,弹出提示:不能发布空微博 2.如果输入的文字超过120,弹出提示,微博内容不能超过120 3.正常发布微博到列表里 ...
- 数组map用法总结
数组中,map方法,指的是是数组的映射. map基本语法如下:function回调支持3个参数,第1个是遍历的数组内容:第2个是对应的数组索引,第3个是数组本身. map方法的作用不难理解,“映射”嘛 ...
- Git同步Python代码
之前我们都是将代码保存到本地目录, 然后再上传到Git中,但如果针对在pycharm中的代码,就要换另一种方式了,下面简单介绍一下. 1.打开pycharm主界面,选择菜单栏VCS---checkou ...
- python 不定长参数*args
- Java练习 SDUT-1160_某年某月的天数
C语言实验--某年某月的天数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入年和月,判断该月有几天? Input ...
- linux 系统下如何进行用户之间的切换
切换用户的命令是su,su是(switch user)切换用户的缩写.通过su命令,可以从普通用户切换到root用户,也可以从root用户切换到普通用户.从普通用户切换到root用户需要密码(该密码是 ...