4
回答
mysql查询使用了覆盖索引,为什么查询时还会用到using where过滤呢
华为云实践训练营,热门技术免费实践!>>>   

如题(mysql版本:5.6):

我理解的using where是在mysql server中过滤元组的,这条语句是怎么执行的(流程图)?

举报
丶流忆
发帖于1年前 4回/525阅
共有4个答案 最后回答: 1年前
看看你的索引
--- 共有 6 条评论 ---
丶流忆回复 @ToBeHJH : 嗯,读取磁盘记录时才使用ICP,但我上面这个问题where条件都使用了索引,不是在过滤索引列后面的条件才触发using where么? 1年前 回复
ToBeHJH回复 @丶流忆 : Using where是作用在mysql server层...为什么不使用ICP,楼上的解释已经比较清楚了。你可以看一下官方手册https://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html 1年前 回复
空无一长物回复 @丶流忆 : 这里的using where不需要再去server了,因为你这里使用了using index已经查到数据了,再在这个数据的基础上进行过滤,这个using where的作用体现在这里 1年前 回复
丶流忆我知道这个,查select * 不是走覆盖索引了,而是使用了index_condition_pushdow过滤索引,再从磁盘中读取记录。我是想知道:使用覆盖索引又有using where的执行流程。是不是使用覆盖索引了explain 中的type值为range时就返回到mysql server中过滤,为什么不会使用index_condition_pushdown? 1年前 回复
空无一长物回复 @丶流忆 : 你试着使用select * from试试,我觉得导致这个得原因应该是你只查了discount_amount这一列而不是查多列,使用using index和using where效率更高 1年前 回复
要不要试试 select discount_amount from ( select discount_amount,limit_amount from test where discount_amount =10 ) t where limit_amount>10
--- 共有 3 条评论 ---
丶流忆回复 @梦想岛 : 可以吧,范围查询能不能使用index还会跟基数有关 1年前 回复
梦想岛回复 @丶流忆 : <>好像不能用到index的 1年前 回复
丶流忆??这个说明了什么?这条语句 物理表 使用了索引,派生表没用应用到索引。我的问题是想弄明白:extra列的值为using where;using index时,查询语句的执行流程,在那里执行了using where(我理解是mysql server),为什么是using where 而不是icp 1年前 回复
尝试一下discount_mount > 10 and limit_amount>10看看Extra
--- 共有 1 条评论 ---
丶流忆我刚刚查看了高性能mysql,在再第六章 6.2上说到,覆盖索引是在mysql 服务器层完成的,我猜测是计算where条件上的索引时,如果是覆盖索引,查询语句都不需要经过存储引擎了,mysql 服务器直接获取索引,然后筛选,所以就有了using where 1年前 回复
顶部