博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中Index Merge简介
阅读量:4317 次
发布时间:2019-06-06

本文共 1857 字,大约阅读时间需要 6 分钟。

索引合并优化

官网翻译

 索引合并是为了减少几个范围(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]

转载于:https://www.cnblogs.com/halu126/p/5046855.html

你可能感兴趣的文章
Python多进程multiprocessing使用示例
查看>>
小学数学题大礼包
查看>>
分众模式下的学员管理
查看>>
Linux安装Solr
查看>>
ActiveX安全
查看>>
js获取浏览器 尺寸信息
查看>>
/etc/inittab 学习
查看>>
xmpp IOS开发高级
查看>>
[转] - linux下使用write\send发送数据报 EAGAIN : Resource temporarily unavailable 错
查看>>
从0开始 图论学习 拓扑排序 链式前向星表示法
查看>>
centos6.5安装pip方法
查看>>
WCF常用绑定选择
查看>>
OGRE COMMAND-LINE UTILITIES
查看>>
IO:in、out和err
查看>>
Linux记录-使用python临时搭建web服务器
查看>>
日期转换为新数据类型CONVERT() 函数
查看>>
C#设计模式之十外观模式(Facade Pattern)【结构型】
查看>>
Redis进阶实践之十五 Redis-cli命令行工具使用详解第二部分(结束)
查看>>
Git使用gitignore建立项目过滤规则
查看>>
Can you solve this equation?
查看>>