2012-03-21 82 views
0
SELECT p.id, 
     p.title, 
     p.slug, 
     p.content, 
     (SELECT url 
     FROM gallery 
     WHERE postid = p.id 
     LIMIT 1) AS url, 
     t.name 
FROM posts AS p 
     INNER JOIN termrel AS tr 
     ON (tr.object = p.id) 
     INNER JOIN termtax AS tx 
     ON (tx.id = tr.termtax_id) 
     INNER JOIN terms AS t 
     ON (t.id = tx.term_id) 
WHERE tx.taxonomy_id = 3 
     AND p.post_status IS NULL 
ORDER BY t.name ASC 

此查询大约需要执行0.2407秒。如何使它快速?缓慢的查询执行时间

+1

请标记RDBMS。从'LIMIT'我假设MySQL。 – 2012-03-21 18:35:22

+0

你对这些表有什么指标? – 2012-03-21 19:33:33

回答

0

相关的子查询可能具有次低性能,因为它们是executed row by row. 要解决此问题,请将相关子查询移动到常规子查询/派生表中并加入到它中。然后它将不会逐行执行整个返回的结果集,因为它将在select语句之前执行。

确认correaledated子查询的mysql特定链接在mysql中不是最佳选择。 How to optimize Answer indicating msql notoriously bad at optimizing correlated subqueries

我使用SQL服务器,但我敢肯定,原则是MySQL一样的,所以我希望你这至少分,在正确的方向。你需要对每笔贷款进行分区/返回一个结果,也许有些人可以在mysql特定的语法中敲打,我可以更新我的答案

select 
    p.id 
    ,p.title 
    ,p.slug 
    ,p.content 
    ,t.name 
    ,mySubQuery.value 
from 
    posts as p 
    inner join termrel as tr 
    on (tr.object = p.id) 
    inner join termtax as tx 
    on (tx.id = tr.termtax_id) 
    inner join terms as t 
    on (t.id = tx.term_id) 

    left join (
       -- use MYSQL function to partition the reslts and only return 1, I use sql-server, not sure of the RDMS specific syntax 
       select 
       id 
       ,url 
       from 
        gallery 
       limit 1 
      ) as mySubquery 
    on mySubquery.id = p.id 


where 
    tx.taxonomy_id = 3 
    and p.post_status is null 
order by 
    t.name asc