2012-12-07 7 views
2

나는이 다음 질의MySQL의 쿼리 최적화 [가입]

SELECT 
i.*, 
gu.* 
vs.* 
FROM 
common.global_users gu 
LEFT JOIN common.global_users_perms gup ON (gu.global_user_id=gup.global_user_id) 
LEFT JOIN p.individuals i ON (gup.parent_id = i.member_id) 
LEFT JOIN p.vs ON (i.member_id=vs.member_id AND vs.status IN (1,4)) 
WHERE gup.region = 'us' 
AND gu.user_type=2 
AND ((gu.email='[email protected]') OR (i.email='[email protected]') OR (gu.username='[email protected]')) 
ORDER BY i.status, vs.member_id; 

및 향후 계획

+----+-------------+-------+--------+------------------------------------------+------------------+---------+-----------------------------+--------+----------+---------------------------------+ 
| id | select_type | table | type | possible_keys       | key    | key_len | ref       | rows | filtered | Extra       | 
+----+-------------+-------+--------+------------------------------------------+------------------+---------+-----------------------------+--------+----------+---------------------------------+ 
| 1 | SIMPLE  | gu | ref | PRIMARY,username,idx_user_type,idx_email | idx_user_type | 1  | const      | 524243 | 100.00 | Using temporary; Using filesort | 
| 1 | SIMPLE  | gup | ref | global_user_id_2       | global_user_id_2 | 4  | common.gu.global_user_id |  1 | 100.00 | Using where      | 
| 1 | SIMPLE  | i  | eq_ref | PRIMARY         | PRIMARY   | 4  | common.gup.parent_id  |  1 | 100.00 | Using where      | 
| 1 | SIMPLE  | vs | ref | member_id,status       | member_id  | 4  | p.i.member_id    |  1 | 100.00 |         | 
+----+-------------+-------+--------+------------------------------------------+------------------+---------+-----------------------------+--------+----------+---------------------------------+ 

빨리을 할 가능성이 있습니까? 이제 약 12 ​​초가 걸립니다.

P. gu 테이블에만 2 개의 고유 한 type 값. 그리고 그 테이블의 모든 recirds는 1M 이상입니다.

답변

0

당신의 계획 결과는 문제 '임시 사용을 나타낼 수 있습니다; filesort를 사용하면 디스크에 정렬 작업이 수행되고 있음을 의미합니다. 가능한 경우 메모리 제한을 늘려야 할 수 있습니다.

그것은 또한 당신이에 대해 정렬 열이 할 수 있습니다. ORDER BY를 제거하면 쿼리가 더 빨리 실행됩니까? 그럴 경우에는 ORDER BY Optimization

+0

넵, ORDER 절을 사용하지 않고 쿼리를 두 번 더 빨리 수행 할 수 있지만 제 경우에는 두 개의 다른 테이블 (그리고 첫 번째 테이블의 테이블이 아님)의 순서 절에있는 필드를 사용하는 것이 더 빠릅니다. '어떤 경우에는, MySQL은 당신이 여러 테이블을 조인하는 하여 ORDER를 해결하기 위해 인덱스를 사용 할 수 없으며, BY 순서대로 열은 모든 rows.'를 검색하는 데 사용되는 첫 번째 비상 수 테이블에서하지 않습니다 – user1016265