MySQL索引合并

索引合并

一般认为使用到多个索引来完成一次查询 的执行方法称之为: index merge ,具体的索引合并算法有下边三种。

Intersection合并

Intersection 翻译过来的意思是 交集 。这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取交集,也就是得到主键值的交集,然后再去回表查询到需要得到的信息。

Intersection索引合并的适用场景是单独根据搜索条件从某个二级索引中获取的记录数太多,导致回 表开销太大,合并后可以明显降低回表开销,从而使用索引合并。

MySQL 在某些特定的情况下才可能会使用到 Intersection 索引合并: 情况一:二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能 出现只出现匹配部分列的情况。情况二:主键列可以是范围匹配。另外,不仅是多个二级索引之间可以采用 Intersection 索引合并,索引合并也可以有聚簇索引参加,也就是我 们上边写的 情况二 :在搜索条件中有主键的范围匹配的情况下也可以使用 Intersection 索引合并索引合并。

上边说的 情况一 和 情况二 只是发生 Intersection 索引合并的必要条件,不是充分条件。也就是说即使 情况一、情况二成立,也不一定发生 Intersection 索引合并,这得看优化器的心情。优化器只有在单独根据搜 索条件从某个二级索引中获取的记录数太多,导致回表开销太大,而通过 Intersection 索引合并后需要回表的 记录数大大减少时才会使用 Intersection 索引合并。

只有在二级索引列都是等值匹配的情况下才可能使用 Intersection 索 引合并,是因为只有在这种情况下根据二级索引查询出的结果集是按照主键值排序的

Union合并

Union翻译过来的意思是 并集,这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取并集,也就是得到主键值的并集,然后再去回表查询到需要得到的信息。

MySQL 在某些特定的情况下才可能会使用到 Union 索引合并: 情况一:二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能 出现只出现匹配部分列的情况。情况二:主键列可以是范围匹配 情况三:使用 Intersection 索引合并的搜索条件。当然,查询条件符合了这些情况也不一定就会采用 Union 索引合并,也得看优化器的心情。优化器只有在单独根 据搜索条件从某个二级索引中获取的记录数比较少,通过 Union 索引合并后进行访问的代价比全表扫描更小时才 会使用 Union 索引合并。

Sort-Union合并

Sort-Union:这里是说某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果经过排序后取并集,也就是得到排好序的主键值的并集,然后再去回表查询到需要得到的信息。

先根据 key1 < 'a' 条件从 idx_key1 二级索引总获取记录,并按照记录的主键值进行排序 再根据 key3 > 'z' 条件从 idx_key3 二级索引总获取记录,并按照记录的主键值进行排序 因为上述的两个二级索引主键值都是排好序的,剩下的操作和 Union 索引合并方式就一样了。

Sort-Union的适用场景是单独根据搜索条件从某个二级索引中获取的记录数比较少,这样即使对这些二 级索引记录按照主键值进行排序的成本也不会太高

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值