开发者

Will MySQL Optimize the lower half of a union query

开发者 https://www.devze.com 2023-01-29 13:07 出处:网络
Is there any way (or is it automatic) for MySQL to optimize the bottom half of a UNION ALL query if I impose a LIMIT statement on the number of results which should be returned. For instance if I have

Is there any way (or is it automatic) for MySQL to optimize the bottom half of a UNION ALL query if I impose a LIMIT statement on the number of results which should be returned. For instance if I have a query as such:

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

If I run this query and the first query for an match in the nam开发者_如何学运维e returns 15 results, there should be no reason to even run the second query, as I already have enough results. Does MySQL Optimize away the second query, or is there a way to tell it to do so? Based on performing the query with EXPLAIN EXTENDED in front, it doesn't appear as though the second part is optimized away.


After a bit of testing, it seems that even though it does show the second query in the "EXPLAIN" output, it doesn't run the second query if necessary. I performed the following query:

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;

Now, in a table with 3 million rows, the last query should take a long time (and I tested it alone, and it does take a long time), but when added as part of a union, it doesn't slow down the query at all, because it isn't even necessary to run it, because we get enough rows from the first two statements. If I increase the Limit to a larger number such that I don't get enough results from the first two queries, the third query comes into play and starts slowing down the query significantly.


With your real query, is it possible to do something like this? (untested)

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;

Edit
I read your question again and realized i missunderstood the question. I thought you where asking how to prioritize name matches over description matches. I'm leaving the code in, in case it comes out on top performance wise anyway.

0

精彩评论

暂无评论...
验证码 换一张
取 消