Index_merge

SELECT uid, target_uid, reward_value, reward_name, lottery_status, create_time FROM user_lottery_reward_log
WHERE act_id = 18 AND (uid = 22381848 OR (target_uid = 22381848 AND lottery_status != 3))
ORDER BY create_time DESC

索引如下:
在这里插入图片描述
explain结果如下:
在这里插入图片描述
下面介绍下 Index_merge.
Index Merge——索引归并,即针对一张表,同时使用多个索引进行查询,然后将各个索引查出来的结果进行进一步的操作,可以是求交 ——Intersect,也可以是求和——Union,针对union还有一种补充算法——Sort-Union.

Intersect

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

  1. 条件使用到复合索引中的所有字段或者左前缀字段(对单字段索引也适用)
    key_part1=const1 AND key_part2=const2 … AND key_partN=constN
  2. 主键上的任何范围条件
    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;

需要注意的点:

  1. 索引覆盖扫描,无需回表
  2. 索引不能覆盖,则对满足条件的在进行回表。
  3. 如果where条件之一包含主键,则主键不需要回表,但被用来过滤其他需要回表的字段。
    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.(翻译的很别扭)
    多个and连接出现Intersect,可以考虑建复合索引。这样可以避免使用index_merge,转而使用更高效的算法。
union

index uion merge就是多个索引条件扫描,对得到的结果进行并集运算,显然是多个条件之间进行的是 OR 运算。
下面几种类型的 where 条件,以及他们的组合可能会使用到 index union merge算法:

  1. 条件使用到复合索引中的所有字段或者左前缀字段(对单字段索引也适用)
  2. 主键上的任何范围条件
  3. 任何符合 index intersect merge 的where条件;
sort_union

当WHERE子句转换为OR组合的多个范围条件时,此访问算法适用,但Index Merge union 算法不适用。sort-union算法和union算法之间的区别在于sort-union算法必须首先获取所有行的行ID,然后在返回任何行之前对它们进行排序。

一些优化:

如果mysql没有对于复杂的and和or嵌套条件没有使用index_merge技术,可以使用下面的公式进行转换
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值