【问题标题】:query with multiple or vs union multiple queries, which one will be faster?使用多个查询或与联合多个查询进行查询,哪一个会更快?
【发布时间】:2011-05-09 01:16:47
【问题描述】:

顾名思义,多个或的查询会更快,还是多个查询与联合结合的查询会更快?为了简单起见,我只加入了两个表,但可以加入更多表。

例如,

    select isbn, booktitle from book as b left join publisher as p
        on b.publisherid = p.publisherid
        where 
           booktitle like '%mysql%' or
           isbn like '%mysql%' or
           publishername like '%mysql%'  

      select isbn, booktitle from book as b left join publisher as p
   on b.publisherid = p.publisherid
   where 
    booktitle like '%mysql%'  
   union 
   select isbn, booktitle from book as b left join publisher as p
   on b.publisherid = p.publisherid
   where 
    isbn like '%mysql%' 
   union 
   select isbn, booktitle from book as b left join publisher as p
   on b.publisherid = p.publisherid
    where 
    publishername like '%mysql%'  

【问题讨论】:

  • 你自己试试看,然后你可以问我们“我发现第一个查询执行的时间是第二个查询的一半,有人可以解释一下吗?”
  • 如果你的 ISBN 字段在任何地方都有“mysql”,那么你有一些非常糟糕的数据问题。

标签: mysql optimization query-optimization unions


【解决方案1】:

我看不出你们的工会会更快。您必须扫描并加入 3 次,而在第一次中,您只需扫描一次,并且对于每条加入的记录,您都可以应用条件。

【讨论】:

    【解决方案2】:

    因为您只查询数据一次,所以顶部的效率会更高。也就是说,如果您正在查询不会返回的数据,最好将这些条件放在WHEREIN 子句中。在您提供的示例中,它看起来像这样:

    SELECT isbn, booktitle
    FROM book as b 
    WHERE 
       booktitle LIKE '%mysql%' or
       isbn like '%mysql%' or
       b.publisherid in (SELECT publisherid FROM publisher WHERE publishername like '%mysql%')
    

    通过过滤列(在本例中为发布商名称)上的适当索引,MySQL 将优化每个部分并更有效地组合它们。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2013-03-30
      相关资源
      最近更新 更多