에 '임시 사용'피하십시오 :내가 두 테이블, <code>users</code> 및 <code>followers</code>이 MySQL을 어떤 경우
표 users
:
id INT, PRIMARY_KEY
name VARCHAR
joined INT
이 표는 id
및 joined
에 색인됩니다.
테이블 '추종자'
user INT
follows INT
이 표는 users
및 follows
에 색인이 생성됩니다.
이 쿼리는 특정 시간 이후에 가입 한 특정 사용자가 뒤 따르는 모든 사용자의 이름을 찾습니다. 결과는 역순으로 이어야합니다.
id key extra
-----------------------------------
u joined Using where
f follows Using index
지금까지 너무 좋은 : 사용자 X가 추종자의 수가 많은 경우
SELECT u.name
FROM users u, followers f
WHERE f.user = X
AND f.follows = u.id
AND u.joined > 1234
ORDER BY u.joined DESC
지금, EXPLAIN
다음과 같은 수 있습니다. ('using'은 내가 간결하게하기 위해 제거한 다른 절들 때문입니다.) 사용자 X가 추종자의 작은 숫자가있는 경우그러나, 이런 일이 발생 :
id key extra
-----------------------------------
f follows Using temporary, using filesort
u joined Using where
나는 ORDER BY
를 생략하면, 내가 얻을 :
id key extra
-----------------------------------
f follows
u joined Using where
MySQL의 최적화는 검사 것으로 보인다 처리해야하는 행의 수이며, 작을 경우 followers
테이블을 먼저 처리해야합니다. 최적화 단계에서 ORDER BY
을 무시한 것으로 보입니다. 임시 테이블에 으로 인해 쿼리 속도가 느려집니다.
내 질문에 : MySQL이 테이블 검색을 수행하는 순서를 강제 할 수 있습니까? 가능성이있는 경우 이것이 가능하지 않습니다. using temporary
을 제거 할 다른 방법이 있습니까?
느린 쿼리를 통해 얼마나 많은 레코드를 얻을 수 있습니까? 사용자가 팔로어를 소량 가지고있을 때 당신이 사용합니까? –
아마 약 100; 많은 수천이 될 수 있습니다. – Graham
귀하의 질의가 다음과 같으면 어떻게됩니까 :'SELECT u.유 INNER는 = u.id WHERE f.user = 'XXX' 및 u.joined> 1234 u.joined DESC' –