2014-10-22 4 views
1

드루팔 (Drupal 7)에서 실행 시간이 60 초 이상 걸리는 쿼리가 있습니다. 여러 조인이 있지만 조인되고있는 모든 항목에 인덱스가 있습니다 (BTREE). 왜 그렇게 천천히 실행되는지 모르겠습니다. 어쩌면 이것이 바로 그 방법일까요? 저는 DBA 나이 쿼리의 개발자는 아니지만 병 목을 진단하려고합니다. 예를 들어 Google에서 색인을 생성 할 때 큰 문제가 발생합니다.mySQL 실행 쿼리가 매우 느림 - 60 초

제공하신 도움에 감사드립니다.

* UPDATED 조회하고 변경 한 후 나는 적어도 약 20 % 아래로 처리 시간을 얻을 수 있었다 권장 것을, 참고 설명한다. 여전히 느리지 만 빨라지고 있습니다. where 및 order by 절의 모든 필드에는 인덱스가 있습니다. 또한, "! ="을 사용하지 않고 어떻게 사용할 수 있을지 잘 모르겠습니다. 제안은 분명 공개 될 것입니다. 마지막으로 filesort 사용을 중지하거나 색인을 존중하는 방법을 알지 못합니다. 도움이된다고 생각하면 색인을 게시하게되어 기쁩니다. 지금까지 도와 주신 모든 분들께 감사드립니다! * 본질적으로

SELECT 
    n.type AS type, 
    CASE 
     WHEN n.type = 'book_new' THEN workid.field_workid_target_id 
     ELSE n.nid 
    END AS uuid, 
    CASE 
     WHEN n.type = 'book_new' THEN UNIX_TIMESTAMP(MIN(sale_date.field_onsaledate_value)) 
     ELSE n.created 
    END AS sort_date 
FROM 
    node n 
     LEFT OUTER JOIN 
    field_data_field_related_books books ON n.nid = books.entity_id 
     LEFT OUTER JOIN 
    field_data_field_author_ref author_refs ON books.entity_id = author_refs.entity_id 
     LEFT OUTER JOIN 
    field_data_field_workid workid ON n.nid = workid.entity_id 
     LEFT OUTER JOIN 
    field_data_field_onsaledate sale_date ON workid.entity_id = sale_date.entity_id 
     LEFT OUTER JOIN 
    field_data_field_format format ON sale_date.entity_id = format.entity_id 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects ON format.entity_id = subjects.entity_id 
     AND subjects.field_subjectcategories_tid = '48981' 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects2 ON subjects.entity_id = subjects2.entity_id 
     AND subjects2.field_subjectcategories_tid = '54556' 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects3 ON subjects2.entity_id = subjects3.entity_id 
     AND subjects3.field_subjectcategories_tid = '61091' 
WHERE 
    ((books.field_related_books_target_id IN ('874271')) 
     OR (author_refs.field_author_ref_target_id IN ('874561' , '572716', '874551')) 
     OR (((subjects.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects2.field_subjectcategories_tid IS NOT NULL)) 
     OR ((subjects2.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects3.field_subjectcategories_tid IS NOT NULL)) 
     OR ((subjects.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects3.field_subjectcategories_tid IS NOT NULL)))) 
     AND (n.status = '1') 
     AND (n.type != 'wow') 
     AND (n.type != 'event') 
     AND (n.type != 'slice') 
     AND (n.nid NOT IN ('874271')) 
     AND (sale_date.field_onsaledate_value < CURDATE() 
     OR sale_date.field_onsaledate_value IS NULL) 
     AND ((format.field_format_tid NOT IN ('2296' , '4986', '1641', '1756')) 
     OR (format.field_format_tid IS NULL)) 

GROUP BY uuid 

ORDER BY books.field_related_books_target_id = 874271 DESC , 
      author_refs.field_author_ref_target_id = 874561 DESC , 
      author_refs.field_author_ref_target_id = 572716 DESC , 
      author_refs.field_author_ref_target_id = 874551 DESC , 
      sort_date DESC 
LIMIT 36 OFFSET 35; 



    +----+-------------+-------------+------+---------------------------------------+------------------+---------+---------------------------+--------+----------+--------------------------------------------------------+ 
| id | select_type | table  | type | possible_keys       | key    | key_len | ref      | rows | filtered | Extra             | 
+----+-------------+-------------+------+---------------------------------------+------------------+---------+---------------------------+--------+----------+--------------------------------------------------------+ 
| 1 | SIMPLE  | n   | ref | PRIMARY,node_status_type,node_type | node_status_type | 4  | const      | 342627 |  100 | Using index condition; Using temporary; Using filesort | 
| 1 | SIMPLE  | books  | ref | entity_id        | entity_id  | 4  | prhc2.n.nid    |  1 |  100 | NULL             | 
| 1 | SIMPLE  | author_refs | ref | entity_id        | entity_id  | 4  | prhc2.books.entity_id  |  1 |  100 | NULL             | 
| 1 | SIMPLE  | workid  | ref | entity_id        | entity_id  | 4  | prhc2.n.nid    |  1 |  100 | NULL             | 
| 1 | SIMPLE  | sale_date | ref | entity_id        | entity_id  | 4  | prhc2.workid.entity_id |  1 |  100 | Using where           | 
| 1 | SIMPLE  | format  | ref | entity_id        | entity_id  | 4  | prhc2.sale_date.entity_id |  1 |  100 | Using where           | 
| 1 | SIMPLE  | subjects | ref | entity_id,field_subjectcategories_tid | entity_id  | 4  | prhc2.format.entity_id |  1 |  100 | Using where           | 
| 1 | SIMPLE  | subjects2 | ref | entity_id,field_subjectcategories_tid | entity_id  | 4  | prhc2.subjects.entity_id |  1 |  100 | Using where           | 
| 1 | SIMPLE  | subjects3 | ref | entity_id,field_subjectcategories_tid | entity_id  | 4  | prhc2.subjects2.entity_id |  1 |  100 | Using where           | 
+----+-------------+-------------+------+---------------------------------------+------------------+---------+---------------------------+--------+----------+--------------------------------------------------------+ 



describe node; 
+-----------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+------------------+------+-----+---------+----------------+ 
| nid  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| vid  | int(10) unsigned | YES | UNI | NULL |    | 
| type  | varchar(32)  | NO | MUL |   |    | 
| language | varchar(12)  | NO | MUL |   |    | 
| title  | varchar(255)  | NO | MUL |   |    | 
| uid  | int(11)   | NO | MUL | 0  |    | 
| status | int(11)   | NO | MUL | 1  |    | 
| created | int(11)   | NO | MUL | 0  |    | 
| changed | int(11)   | NO | MUL | 0  |    | 
| comment | int(11)   | NO |  | 0  |    | 
| promote | int(11)   | NO | MUL | 0  |    | 
| sticky | int(11)   | NO |  | 0  |    | 
| tnid  | int(10) unsigned | NO | MUL | 0  |    | 
| translate | int(11)   | NO | MUL | 0  |    | 
| downgrade | int(11)   | NO |  | 0  |    | 
+-----------+------------------+------+-----+---------+----------------+ 

describe field_data_field_related_books; 
+-------------------------------+------------------+------+-----+---------+-------+ 
| Field       | Type    | Null | Key | Default | Extra | 
+-------------------------------+------------------+------+-----+---------+-------+ 
| entity_type     | varchar(128)  | NO | PRI |   |  | 
| bundle      | varchar(128)  | NO | MUL |   |  | 
| deleted      | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id      | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id     | int(10) unsigned | YES | MUL | NULL |  | 
| language      | varchar(32)  | NO | PRI |   |  | 
| delta       | int(10) unsigned | NO | PRI | NULL |  | 
| field_related_books_target_id | int(10) unsigned | NO | MUL | NULL |  | 
+-------------------------------+------------------+------+-----+---------+-------+ 

describe field_data_field_author_ref; 
+----------------------------+------------------+------+-----+---------+-------+ 
| Field      | Type    | Null | Key | Default | Extra | 
+----------------------------+------------------+------+-----+---------+-------+ 
| entity_type    | varchar(128)  | NO | PRI |   |  | 
| bundle      | varchar(128)  | NO | MUL |   |  | 
| deleted     | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id     | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id    | int(10) unsigned | YES | MUL | NULL |  | 
| language     | varchar(32)  | NO | PRI |   |  | 
| delta      | int(10) unsigned | NO | PRI | NULL |  | 
| field_author_ref_target_id | int(10) unsigned | NO | MUL | NULL |  | 
+----------------------------+------------------+------+-----+---------+-------+ 

describe field_data_field_workid; 
+------------------------+------------------+------+-----+---------+-------+ 
| Field     | Type    | Null | Key | Default | Extra | 
+------------------------+------------------+------+-----+---------+-------+ 
| entity_type   | varchar(128)  | NO | PRI |   |  | 
| bundle     | varchar(128)  | NO | MUL |   |  | 
| deleted    | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id    | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id   | int(10) unsigned | YES | MUL | NULL |  | 
| language    | varchar(32)  | NO | PRI |   |  | 
| delta     | int(10) unsigned | NO | PRI | NULL |  | 
| field_workid_target_id | int(10) unsigned | NO | MUL | NULL |  | 
+------------------------+------------------+------+-----+---------+-------+ 

describe field_data_field_onsaledate; 
+------------------------+------------------+------+-----+---------+-------+ 
| Field     | Type    | Null | Key | Default | Extra | 
+------------------------+------------------+------+-----+---------+-------+ 
| entity_type   | varchar(128)  | NO | PRI |   |  | 
| bundle     | varchar(128)  | NO | MUL |   |  | 
| deleted    | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id    | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id   | int(10) unsigned | YES | MUL | NULL |  | 
| language    | varchar(32)  | NO | PRI |   |  | 
| delta     | int(10) unsigned | NO | PRI | NULL |  | 
| field_onsaledate_value | datetime   | YES |  | NULL |  | 
+------------------------+------------------+------+-----+---------+-------+ 

describe field_data_field_format; 
+------------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+------------------+------------------+------+-----+---------+-------+ 
| entity_type  | varchar(128)  | NO | PRI |   |  | 
| bundle   | varchar(128)  | NO | MUL |   |  | 
| deleted   | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id  | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id  | int(10) unsigned | YES | MUL | NULL |  | 
| language   | varchar(32)  | NO | PRI |   |  | 
| delta   | int(10) unsigned | NO | PRI | NULL |  | 
| field_format_tid | int(10) unsigned | YES | MUL | NULL |  | 
+------------------+------------------+------+-----+---------+-------+ 

describe field_data_field_subjectcategories; 
+-----------------------------+------------------+------+-----+---------+-------+ 
| Field      | Type    | Null | Key | Default | Extra | 
+-----------------------------+------------------+------+-----+---------+-------+ 
| entity_type     | varchar(128)  | NO | PRI |   |  | 
| bundle      | varchar(128)  | NO | MUL |   |  | 
| deleted      | tinyint(4)  | NO | PRI | 0  |  | 
| entity_id     | int(10) unsigned | NO | PRI | NULL |  | 
| revision_id     | int(10) unsigned | YES | MUL | NULL |  | 
| language     | varchar(32)  | NO | PRI |   |  | 
| delta      | int(10) unsigned | NO | PRI | NULL |  | 
| field_subjectcategories_tid | int(10) unsigned | YES | MUL | NULL |  | 
+-----------------------------+------------------+------+-----+---------+-------+ 
+0

mysql의 실행 계획을보기 위해 'explain your_query_here'를 실행하십시오. –

+0

마크 B, 그랬습니다. 위의 쿼리 바로 아래에 있습니다. – MrModus

답변

0

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html 나는 그 속도 저하와 아무 상관이 있는지 잘 모르겠어요, 조인의 순서에 약간의 변화를 만들었지 만, 여러 테이블을 조인 할 때 나는부터 논리적 인 방법으로 체인 그들에게 시도 첫 번째 테이블과 다음, 다음, 다음으로 이동 ... 다음 조인에서 동일한 테이블로 돌아 가지 않습니다. 자체 조인이 아니면 별칭을 사용합니다. 내가 확인 할

SELECT 
    n.type AS type, 
    CASE 
     WHEN n.type = 'book_new' THEN workid.field_workid_target_id 
     ELSE n.nid 
    END AS uuid, 
    CASE 
     WHEN n.type = 'book_new' THEN UNIX_TIMESTAMP(MIN(sale_date.field_onsaledate_value)) 
     ELSE n.created 
    END AS sort_date 
FROM 
    node n 
     LEFT OUTER JOIN 
    field_data_field_related_books books ON n.nid = books.entity_id 
     LEFT OUTER JOIN 
    field_data_field_author_ref author_refs ON books.entity_id = author_refs.entity_id 
     LEFT OUTER JOIN 
    field_data_field_workid workid ON workid.nid = author_refs.entity_id 
     LEFT OUTER JOIN 
    field_data_field_onsaledate sale_date ON workid.entity_id = sale_date.entity_id 
     LEFT OUTER JOIN 
    field_data_field_format format ON sale_date.entity_id = format.entity_id 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects ON format.entity_id = subjects.entity_id 
     AND subjects.field_subjectcategories_tid = '48981' 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects2 ON subjects.entity_id = subjects2.entity_id 
     AND subjects2.field_subjectcategories_tid = '54556' 
     LEFT OUTER JOIN 
    field_data_field_subjectcategories subjects3 ON subjects2.entity_id = subjects3.entity_id 
     AND subjects3.field_subjectcategories_tid = '61091' 
WHERE 
    ((books.field_related_books_target_id IN ('874271')) 
     OR (author_refs.field_author_ref_target_id IN ('874561' , '572716', '874551')) 
     OR (((subjects.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects2.field_subjectcategories_tid IS NOT NULL)) 
     OR ((subjects2.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects3.field_subjectcategories_tid IS NOT NULL)) 
     OR ((subjects.field_subjectcategories_tid IS NOT NULL) 
     AND (subjects3.field_subjectcategories_tid IS NOT NULL)))) 
     AND (n.status = '1') 
     AND (n.nid NOT IN ('874271')) 
     AND (n.type != 'wow') 
     AND (n.type != 'event') 
     AND (n.type != 'slice') 
     AND (sale_date.field_onsaledate_value < CURDATE() 
     OR sale_date.field_onsaledate_value IS NULL) 
     AND ((format.field_format_tid NOT IN ('2296' , '4986', '1641', '1756')) 
     OR (format.field_format_tid IS NULL)) 
GROUP BY uuid 
ORDER BY books.field_related_books_target_id = 874271 DESC , author_refs.field_author_ref_target_id = 874561 DESC , author_refs.field_author_ref_target_id = 572716 DESC , author_refs.field_author_ref_target_id = 874551 DESC , sort_date DESC 
LIMIT 36 OFFSET 35; 

다른 것은 당신이 테이블에있는 인덱스이다 : 그것은 여기있다, 당신은 당신이 그들을 더 나은 조직이 있다면 조금 더 나은 조인하여 추적하는 데 도움이됩니다. 조건들이 색인되어야하는 모든 사람들. 색인은 올바르게 수행해야하는 또 다른 작업이며, 지나치게 수행하고 싶지 않고 논리적으로 원한다면 순서가 달라집니다.

Explain 쿼리에서 342627을 발견했습니다. 데이터베이스에있는 총 레코드입니까? 그렇다면 전체 테이블 스캔을 수행 중이며 인덱스를 존중하지 않는다는 것을 의미합니다.이 인덱스는 2 개의 "조건"과 "임시"만 보았습니다.

+0

제안 해 주셔서 감사합니다. 나는 지금 시험해 볼 것이다. – MrModus

+0

방금 ​​당신의 질문, 미안 Hatem을 발견했습니다. 342627은 노드 테이블의 레코드 수입니다. – MrModus

+0

안녕하세요.나는 당신이 어떤 추가적인 통찰력을 가지고 있는지보기 위해서 막 팔로 걷고 있었다. – MrModus

0

, 당신의 인덱스 인해 곳 조건, 몇 가지 코멘트 구조에 명중되지 않습니다; NOT IN

  • 몹시 비효율적이다, 뭔가 다른이를 변경을 고려
  • 노드 테이블에서 "인덱스 조건을 사용하여"
  • 이 절은 인덱스를 사용하기에 충분히 유용한 무언가가 포함되지 않는 경우 있음을 나타내고 할 choses있다 전체 테이블 스캔. n.type이 색인 된 것을 볼 수 있습니다. n.nid를 아직 색인 생성하지 않은 다른 연산자를 사용하는 것을 볼 수 있습니다! =
  • 귀하의 주문은 파일 정렬을 일으키고 있습니다. mysql 구성을보고 최적화가되었는지 확인하십시오. 파일 정렬;
+0

응답 harvey에 감사드립니다. 이제 Where 절에 대한 색인을 검토하고 있습니다. – MrModus

+0

모든 열에 인덱스가있는 것처럼 보입니다. 나는 어디 가야할지 모르겠습니다. – MrModus

관련 문제