2012-11-30 2 views
1

정말 느리게 실행되는 SQL 쿼리가 있는데 그 이유에 대해 당황 스럽습니다. 쿼리는 다음과 같습니다MySQL 쿼리가 * 매우 * 천천히 실행 중임

SELECT DISTINCT(c.ID),c.* FROM `content` c 
    LEFT JOIN `content_meta` cm1 ON c.id = cm1.content_id 
WHERE 1=1 
    AND c.site_id IN (14) 
    AND c.type IN ('a','t') 
    AND c.status = 'visible' 
    AND (c.lock = 0 OR c.site_id = 14) 
    AND c.level = 0 
    OR 
     (
      ( c.site_id = 14 
      AND cm1.meta_key = 'g_id' 
      AND cm1.meta_value IN ('12','13','7') 
     ) 
      OR 
      ( c.status = 'visible' 
      AND ( 
        (c.type = 'topic' AND c.parent_id IN (628,633,624)) 
       ) 
     ) 
     ) 
ORDER BY c.date_updated DESC LIMIT 20 

내용 테이블은 약 1250 행이 콘텐츠 메타 테이블은 약 3000 행이 있습니다. 이것은 많은 데이터가 아니며 너무 느리게 실행되는 원인이 될지 잘 모르겠습니다. 모든 생각/의견은 크게 감사하겠습니다.

감사합니다.

+1

성능이 부족한 부분을 보려면'explain'을 사용하십시오. 더 많은 정보를 얻으려면 테이블 구조에 대한 더 많은 정보를 제공해야합니다. –

+0

다음 쿼리에서 반환되는 레코드 수 :'select * from content c left join content_meta cm1 on c.id = cm1.content_id'? – mellamokb

+2

where 절에 인덱스가 있고 열을 기준으로 정렬합니까? – Matthew

답변

1

where 절이 맞습니까? 일련의 AND 문을 작성하고 나중에 OR을 실행합니다.

않을까요처럼 정확 뭔가 : 그것은 참으로 올바른 경우

AND (c.lock = 0 OR c.site_id = 14) 
AND (
     (...) 
     OR 
     (...) 
    ) 

, 당신은 구조를 변경하거나 스크립트 또는 절차의 결과를 치료에 생각 할 수있다.

0

결국 "OR"절과 관련이있을 수 있습니다 ... 가능하면 앞면이 인덱스에 의해 활용되고 있지만이 거대한 OR 조건은 결국 하나가 될 수 있습니다 또는 다른. 기본 콘텐츠를 더 많이 알지 못하면 각 엔티티가 자체 색인을 활용하고 자격있는 CID를 얻고 최종 결과에 참여할 수 있도록 내부에 UNION을 갖도록 조정합니다.

select 
     c2.* 
    from 
     (select distinct 
       c.ID 
      from 
       `content` c 
      where 
        c.site_id in (14) 
       and c.type in ('a', 't') 
       and c.status = 'visible' 
       and c.lock in (0, 14) 
       and c.level = 0 
     UNION 
     select 
       c.ID 
      from 
       `content` c 
      where 
        c.status = 'visible' 
       and c.type = 'topic' 
       and c.parent_id in (628, 633, 624) 
     UNION 
     select 
       c.ID 
      from 
       `content` c 
       join `content_meta` cm1 
        on c.id = cm1.content_id 
        AND cm1.meta_key = 'g_id' 
        AND cm1.meta_value in ('12', '13', '7') 
      where   
        c.site_id = 14) PreQuery 
     JOIN `content` c2 
     on PreQuery.cID = c2.cID 
    order by 
     c2.date_updated desc 
    limit 
     20 

I 콘텐츠 테이블을 보장 할은 (PARENT_ID, 유형, 상태)

와 메타 테이블 (content_id를, meta_key, meta_value에 인덱스에 (사이트 ID, 유형, 상태) 또 다른에 인덱스가)

관련 문제