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)
왜 느린가요? 그것을 최적화 할 수 있습니까? 그렇다면 어떻게?
테이블을 인덱싱합니까? –
실행 계획이 무엇입니까? 관련된 테이블의 인덱스는 무엇입니까? –
아직 테이블을 ['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) 쿼리를 할 수 있습니까? –