深入理解 index merge 是使用索引进行优化的重要基础之一。理解了 index merge 技术,我们才知道应该如何在表上建立索引。

1. 为什么会有index merge

我们的 where 中可能有多个条件(或者join)涉及到多个字段,它们之间进行 AND 或者 OR,那么此时就有可能会使用到 index merge 技术。index merge 技术如果简单的说,其实就是:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并(intersect/union)

MySQL5.0之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引分别进行条件扫描。

相关文档:http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html (注意该文档中说的有几处错误)

The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.

In EXPLAIN output, the Index Merge method appears as index_merge in the type column. In this case, the key column contains a list of indexes used, and key_len contains a list of the longest key parts for those indexes.

index merge: 同一个表的多个索引的范围扫描可以对结果进行合并,合并方式分为三种:union, intersection, 以及它们的组合(先内部intersect然后在外面union)。

index merge 算法根据合并算法的不同分成了三种:intersect, union, sort_union.

2. index merge 之 intersect

简单而言,index intersect merge就是多个索引条件扫描得到的结果进行交集运算。显然在多个索引提交之间是 AND 运算时,才会出现 index intersect merge. 下面两种where条件或者它们的组合时会进行 index intersect merge:

3. index merge 之 union

简单而言,index uion merge就是多个索引条件扫描,对得到的结果进行并集运算,显然是多个条件之间进行的是 OR 运算。

下面几种类型的 where 条件,以及他们的组合可能会使用到 index union merge算法:

1) 条件使用到复合索引中的所有字段或者左前缀字段(对单字段索引也适用)

2) 主键上的任何范围条件

3) 任何符合 index intersect merge 的where条件;

上面三种 where 条件进行 OR 运算时,可能会使用 index union merge算法。

4. index merge 之 sort_union

This access algorithm is employed when the WHERE clause was converted to several range conditions combined by OR, but for which the Index Merge method union algorithm is not applicable.(多个条件扫描进行 OR 运算,但是不符合 index union merge算法的,此时可能会使用 sort_union算法)

5. index merge的局限

1)If your query has a complex WHERE clause with deep AND/OR nesting and MySQL does not choose the optimal plan, try distributing terms using the following identity laws:

6. 对 index merge 的进一步优化

index merge使得我们可以使用到多个索引同时进行扫描,然后将结果进行合并。听起来好像是很好的功能,但是如果出现了 index intersect merge,那么一般同时也意味着我们的索引建立得不太合理,因为 index intersect merge 是可以通过建立 复合索引进行更一步优化的。

7. 复合索引的最左前缀原则

上面我们说到,对复合索引的非最左前缀字段进行 OR 运算,是无法使用到复合索引的

SQL如下:
select cd.coupon_id, count(1) total from AAA cd
where  cd.coupon_act_id = 100476 and cd.deleted=0 and cd.pick_time is not null
group by cd.coupon_id ;

在AAA表中,coupon_act_id 和 deleted 都是独立的索引

select count(*) from AAA  where coupon_act_id = 100476;   结果为12360行

select count(*) from AAA where deleted=0;  结果为1300W行

从上面的解释我们可以看出来,index merge其实就是分别通过对两个独立的index进行过滤之后,将过滤之后的结果聚合在一起,然后在返回结果集。

在我们的这个例子中,由于deleted字段的过滤性不好,故返回的rows依然很多,所以造成的很多的磁盘read,导致了cpu的负载非常的高,直接就出现了延迟。

ps:其实在这个case中,并不需要加2个条件的index,只需要将deleted这个index干掉,直接使用coupon_act_id这个index即可,毕竟这个index的过滤的结果集已经很小了。

或者通过关闭index intersect功能也可以。

转载于:https://www.cnblogs.com/hankyoon/p/11012620.html

MySQL 优化之 index_merge (索引合并)相关推荐

  1. MySQL优化篇:索引

    文章目录 1.概念 1.1 是什么 1.2 优缺点 2.MySQL的索引 2.1 Btree索引 2.2 B+Tree索引 3.MySQL索引分类 3.1 单值索引(普通索引) 3.2 唯一索引 3. ...

  2. mysql 分段执行_19个MySQL优化技巧,索引优化这样做最有效!

    - 点击上方"中国统计网"订阅我吧!- 声明:下面的优化方案都是基于" Mysql-索引-BTree类型 "01善用EXPLAIN 做MySQL优化,我们要善用 ...

  3. mysql优化-----多列索引的左前缀规则

    索引优化策略1:索引类型1.1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用.注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎稍 ...

  4. mysql优化器放弃索引场景,MYSQL索引优化(索引失效场景)

    学习mysql是作为一名Java工程师必不可少的事情,但是我们只认识mysql的增删查改建表等等的sql语句其实远远不够的,对于进阶mysql来说,索引是一个很重要的部分.下面我们就来说一下在mysq ...

  5. mysql to days 索引_高性能mysql优化二之索引篇

    前言 为什么要使用索引?索引有什么用途呢?我的亲身经历,一个几千万数据的项目,我写了一条查询,没有用到索引,由于访问量比较大,瞬间网站就跪了,从此以后我写的每一条sql都会explain解析看是否用到 ...

  6. 【mysql优化 2】索引条件下推优化

    原文地址:Index Condition Pushdown Optimization 索引条件下推(ICP:index condition pushdown)是mysql中一个常用的优化,尤其是当my ...

  7. mysql优化之覆盖索引

    覆盖索引 1.当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此时就使用了覆盖索引 mysql> explain select store_id ...

  8. 【MySQL 优化】单一索引与复合索引

    MySQL 单一索引与复合索引 前 言 一.索引的最左前缀匹配原则 二.使用使用联合索引优势 1. 减少开销 2. 覆盖索引 3. 效率高 前 言 单一索引是指索引列为一列的情况,即新建索引的语句只实 ...

  9. mysql优化之前缀索引--带案例分析

    为什么要有前缀索引 有时候需要索引很长的字符串,这会让索引变的大且慢,通常情况下可以使用某个列开始的部分字符串,这样大大的节约索引空间,从而提高索引效率,但这会降低索引的选择性,索引的选择性是指不重复 ...

最新文章

  1. 解决微信小程序textarea层级太高遮挡其他组件的问题
  2. Android中接收系统广播消息
  3. system函数和fork-exec机制
  4. 支付宝18年账单已出,你消费了多少钱?
  5. 【lora无线数传通信模块】亿佰特E22串口模块用于物联网地震预警传感通信方案
  6. python怎么控制小数点位数_谈谈关于Python里面小数点精度控制的问题
  7. 《2020饿了么蓝骑士报告》:贫困县骑手月入5800元 成脱贫新兴力量
  8. 正反观点验证2010年10大安全挑战
  9. MySQL 判断表中是否存在某条数据
  10. java 资源描述文件_j2me新手必看-Java应用描述文件(JAD)编辑器
  11. navicat 导出 oracle数据 乱码,Navicat Premium下sql导入中文乱码解决方案
  12. Linux UDP协议栈中的片段分析 - udp_recvmsg
  13. Windows超级管理器
  14. 一次手机木马的清除记录(手机刷机)
  15. NUIST第十一届程序设计竞赛
  16. 云起赋新 | 亚马逊云科技高性能计算创新论坛精彩来袭!
  17. 全球及中国用于癌症治疗的新型药物输送系统行业研究及十四五规划分析报告
  18. 折叠目录html,在WEB页中实现折叠式动态目录结构
  19. UltraEdit正则表达式使用(Regular Expressions in UltraEdit)
  20. 碎碎念C++(一)冗杂问题

热门文章

  1. 每天一道LeetCode-----从有序数组中删除重复元素
  2. java二重循环换行_Java零基础系列教程05Java二重循环
  3. 解决 LLVM 错误 cannot specify -o when generating multiple output files
  4. ARM处理器中“8位位图”
  5. Windows桌面任务栏透明化
  6. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (括号配对,前缀和)
  7. c语言把四位数1234变成4123,用4个1组成一个数-3,4四个数字可以组成数字不重复和自然数的 – 手机爱问...
  8. 离散数学及其应用上的一个问题
  9. mysql inner join
  10. 2021-02-25