MySQL将优化联合查询的下半部分

时间:2010-12-07 17:46:33

标签: mysql optimization

如果我对应该返回的结果数施加LIMIT语句,那么MySQL是否有任何方式(或者是自动的)优化UNION ALL查询的下半部分。例如,如果我有这样的查询:

SELECT ID FROM MyTable WHERE Match (NameColumn) Against ('seachterm')
UNION ALL
SELECT ID FROM MyTable WHERE (DescriptionColumn) Against ('seachterm')
LIMIT 10;

如果我运行此查询并且名称中匹配的第一个查询返回15个结果,则应该没有理由再运行第二个查询,因为我已经有足够的结果。 MySQL是否优化了第二个查询,还是有办法告诉它这样做?基于在前面使用EXPLAIN EXTENDED执行查询,看起来好像第二部分已经过优化。

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

使用您的真实查询,是否可以执行此类操作? (另)

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;

修改
我再次阅读你的问题并意识到我错过了这个问题。我想你在哪里询问如何在名称匹配上优先考虑名称匹配。我将代码保留下来,以防它以最佳性能表现出来。