2012-07-02 4 views
1

I 27 초 정도이 쿼리를 실행해야합니다 : 이 MySQL Join 쿼리를 최적화 할 수 있습니까?

SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs 
FROM ocal_files 
    INNER JOIN ocal_favs on ocal_favs.clipart_id = ocal_files.id 
GROUP BY ocal_files.id 
ORDER BY favs DESC​ 

(대신 사용자 이름이이 USER_ID해야한다, 나는 사용자를위한 테이블을 가지고 있기 때문에)

ocal_files는 37,457 행을 가지고 있으며, ocal_favs는 18,263

있다 설명의

편집 결과

mysql> EXPLAIN SELECT ocal_files.*, count(DISTINCT ocal_favs.username) as favs FROM ocal_files INNER JOIN ocal_favs on ocal_favs.clipart_i 
d = ocal_files.id GROUP BY ocal_files.id ORDER BY favs DESC;                    
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref        | rows | Extra       | 
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+ 
| 1 | SIMPLE  | ocal_favs | ALL | rlb_clipart_id | NULL | NULL | NULL        | 18622 | Using temporary; Using filesort| 
| 1 | SIMPLE  | ocal_files | eq_ref | PRIMARY  | PRIMARY | 4  | openclipart.ocal_favs.clipart_id |  1 | Using where     | 
+----+-------------+------------+--------+----------------+---------+---------+---------------------------------+-------+---------------------------------+ 
2 rows in set (0.00 sec) 

왜 느린가요? 그것을 최적화 할 수 있습니까? 그렇다면 어떻게?

+3

테이블을 인덱싱합니까? –

+1

실행 계획이 무엇입니까? 관련된 테이블의 인덱스는 무엇입니까? –

+3

아직 테이블을 ['ANALYZE'] (http://dev.mysql.com/doc/refman/5.1/en/analyze-table.html) 해 보셨습니까? MySQL에게 ['EXPLAIN'] (http://dev.mysql.com/doc/refman/5.1/en/using-explain.html) 쿼리를 할 수 있습니까? –

답변

2

봅니다

ocal_favs (clipart_id, username) 

에 인덱스를 생성하고 ocal_favs.usernameNOT NULL 제약 조건이 있는지 확인하거나 조건으로 ocal_favs.username IS NOT NULL을 추가 할 수 있습니다.

이렇게하면 ocal_files과 그 색인에서 모든 정보를 얻을 수 있습니다.

+0

이 쿼리를 호출하기 전에 인덱스를 사용하지 않았습니다 : CREATE INDEX favs_index ON ocal_favs (clipart_id, username) '? – jcubic

+0

나는 사람들을 신뢰하기 때문에 색인을 통해 성과가 향상된다고 들었습니다. – jcubic

+0

인덱스는 확실히 성능을 향상시킬 수 있습니다.이 테스트가 도움이되지만 대신 테스트 할 수있는 것을 신뢰하지는 않습니다. :) –

1

SQL 최적화를 처리 할 때 가장 좋은 방법은 필요로하는 필드 만 선택하는 것입니다. 모든 필드가 필요하지는 않습니다. 이것은 거의 항상 성능에 큰 영향을 미칩니다. 특히 필드가 BLOB's 인 경우. 다른 사용자가 지적한 것처럼 색인 생성은 매우 중요하지만 올바르게 작성한 경우에만 가능합니다. LIMIT 절을 사용하면 한 번에 결과를 표시 할 필요가 없다면 좋은 생각입니다. (나는 의심 스럽지만 여기에있는 경우가 있습니다. 왜냐하면 나는 당신이 30000의 결과를 표시 할 것이라고 생각하지 않기 때문입니다 + 사용자 브라우저에 레코드) ...

관련 문제