2010-12-16 6 views
2

나는에게 MySQL의 (의 MyISAM)에서이 질의를했습니다 차단 (또는이를 최적화하는 방법) :MySQL은

SELECT * FROM `links` WHERE `id` IN (SELECT `link` FROM `posts` WHERE `read_time`<'2010-10-16') 

그것은 나에게 좋아 보이지만, MySQL은 그것으로 끊습니다. 'links'는 16000 개의 행이있는 테이블이고 'posts'는 arround가 5000 개입니다. 'ID'와 '링크'나는 몇 가지 테스트를했습니다

차있는 각 테이블에 몇 가지를 제외하고

  1. 제거 모든 기록. 그것은
  2. 이너 쿼리를 실행 작업 (posts FROM link을 선택 WHERE read_time < '2010-10-16') 제 1 및 실행 외부 쿼리 (* links FROM id IN ('1232', '1354', '3324 SELECT ')). 그것은 내 우분투 업그레이드
  3. 시도를 작동하지만 이것이 무슨 일이야 (5.1.37-1ubuntu5.5)

마지막 MySQL 버전이 있다고? 내가 벌레를 찾았 니? 아니면 내가 잘못하고있는거야?

+0

아니요, 이것은 버그가 아닙니다. 마크 바이어스 (Mark Byers)가 언급했듯이, 'JOIN'은 더 조용하게 작동 할 것이다. 'IN'은 내가 옳은 것을 기억한다면 모든 것을 비교할 것이고 16k * 5k 비교로 끝날 것입니다. – Bobby

+0

게시 계획을 설명하면 답변이 자명 할 것입니다. 조인 + 색인 –

답변

4

MySQL은 현재이 양식의 문을 최적화에 매우 좋지 않다 :

SELECT * 
FROM some_table 
WHERE x IN (subquery) 

MySQL's bug database에 그것은 MySQL을 5.6와 MySQL 6.0에서 해결되어야한다. 당신이 대신 IN의 가입 사용할 수 있습니다 문제를 해결하려면, 당신은 이미이없는 경우

SELECT links.* 
FROM links 
JOIN posts ON links.id = posts.link 
WHERE posts.read_time < '2010-10-16' 

는 또한 read_time에 인덱스를 추가하는 시도해야합니다.

+1

실제로 5.4에서 수정되었음을 알 수 있습니다. 5.5를 설치 한 후 오늘 확인해 보겠습니다. – Mchl

0

마크 바이어스 외에도 'read_time'에 datetime 대신 timestamp를 사용하십시오 (아직 수행하지 않은 경우).