查询语句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”;