2012-03-21 3 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을 가정합니다. –

+0

이 테이블에 어떤 인덱스가 있습니까? –

답변

0

상관 하위 쿼리는 그대로 하위 성능을 나타낼 수 있습니다. executed row by row. 이 문제를 해결하려면 상관 된 하위 쿼리를 일반 하위 쿼리/파생 테이블로 이동하고 조인하십시오. 그런 다음 select 문 이전에 실행되므로 반환 된 전체 결과 집합에 대해 행별로 실행하지 않습니다.

MySQL에서 관련 하위 쿼리를 확인하는 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