首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL是否会优化联合查询的下半部分

MySQL是否会优化联合查询的下半部分
EN

Stack Overflow用户
提问于 2010-12-08 01:46:33
回答 2查看 191关注 0票数 1

如果我对应该返回的结果数量施加一个限制语句,MySQL有没有办法(或者它是自动的)来优化UNION ALL查询的下半部分。例如,如果我有这样的查询:

代码语言:javascript
复制
SELECT ID FROM MyTable WHERE Match (NameColumn) Against ('seachterm')
UNION ALL
SELECT ID FROM MyTable WHERE (DescriptionColumn) Against ('seachterm')
LIMIT 10;

如果我运行这个查询,第一个匹配名称的查询返回15个结果,那么应该没有理由运行第二个查询,因为我已经有了足够的结果。MySQL会优化掉第二个查询吗,或者有没有办法告诉它这样做?基于在前面扩展了EXPLAIN的情况下执行查询,第二部分似乎没有被优化掉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-16 22:30:35

经过一些测试,似乎即使它在"EXPLAIN“输出中显示了第二个查询,但如果需要的话,它不会运行第二个查询。我执行了以下查询:

代码语言:javascript
复制
SELECT ID FROM MyTable WHERE Match (NameColumn) Against ('seachterm')
UNION ALL
SELECT ID FROM MyTable WHERE (DescriptionColumn) Against ('seachterm')
UNION ALL
SELECT ID FROM MyTable WHERE DescriptionColumn LIKE '%seachterm%'
LIMIT 10;

现在,在一个有300万行的表中,最后一个查询应该需要很长时间(我单独测试了它,它确实需要很长时间),但是当作为联合的一部分添加时,它根本不会减慢查询速度,因为甚至不需要运行它,因为我们从前两个语句中获得了足够的行。如果我将限制增加到一个更大的数字,使得我无法从前两个查询中获得足够的结果,则第三个查询开始起作用,并开始显著减慢查询速度。

票数 1
EN

Stack Overflow用户

发布于 2010-12-08 02:51:16

对于你真正的查询,有可能做这样的事情吗?(未测试)

代码语言:javascript
复制
select id
      ,case when nameColumn        like '%Product X%' then 1
            when DescriptionColumn like '%Product X%' then 2
        end as priority
  from MyTable 
 where nameColumn        like '%Product X%'
    or DescriptionColumn like '%Product X%'
 order by priority
 limit 10;

编辑

我又读了一遍你的问题,我意识到我理解错了。我以为你问的是如何优先考虑名称匹配而不是描述匹配。我把代码留在里面,以防它以最佳性能的方式出现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4379828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档