MySQL系列文章---一次索引问题排查

查询语句key1 key3都是二级索引,我用or连接查询的extra是using where,为什么我是用and连接的查询语句不是using intersect呢?

using where是直接使用idx_key1这个索引树,根据搜索条件去读取一个二级索引,然后回表后再过滤另外一个搜索条件。
using intersect 是使用多个索引树去做交集取出id,再次回表
究竟使用哪种查询方式,还是要看成本!!
这里要分析一下两种查询执行方式之间需要的成本代价。
只读取一个二级索引的成本:

按照某个搜索条件读取一个二级索引
根据从该二级索引得到的主键值进行回表操作,然后再过滤其他的搜索条件
读取多个二级索引之后取交集成本:

按照不同的搜索条件分别读取不同的二级索引
将从多个二级索引得到的主键值取交集,然后进行回表操作
虽然读取多个二级索引比读取一个二级索引消耗性能,但是读取二级索引的操作是顺序I/O,而回表操作是随机I/O,所以如果只读取一个二级索引时需要回表的记录数特别多,而读取多个二级索引之后取交集的记录数非常少,当节省的因为回表而造成的性能损耗比访问多个二级索引带来的性能损耗更高时,读取多个二级索引后取交集比只读取一个二级索引的成本更低。

如果你想看具体的数据,你可以使用optimizer trace 功能,这里面有一项是analyzing_roworder_intersect,这里面有具体的数据

1. 打开optimizer trace功能 (默认情况下它是关闭的):

SET optimizer_trace=“enabled=on”;

2. 这里输入你自己的查询语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NoLongerConfused

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值