2010-04-21 7 views
0

이 쿼리의 목표는 참조 ID 당 총 고유 레코드 (IP별로 가장 최근의 IP, IP 기준)를 얻는 것입니다.Mysql - GROUP BY 템포를 사용하지 않기

SELECT COUNT(DISTINCT ip), GROUP_CONCAT(ref.id) 
FROM `sess` sess 
JOIN `ref` USING(row_id) 
WHERE sess.time BETWEEN '2010-04-21 00:00:00' AND '2010-04-21 23:59:59' 
GROUP BY ref.id 
ORDER BY sess.time DESC 

쿼리는 정상적으로 작동하지만 임시 테이블을 사용합니다. 어떤 아이디어?

row_id는 두 테이블의 기본 테이블입니다. sess.time, sess.ip 및 ref.id는 모두 색인입니다.

+0

EXPLAIN을 추가 할 수 있습니까? – Unreason

답변

0

아마도 GROUP_CONCAT 때문에 임시 테이블을 사용하고 있습니다. 하지만 그게 정말 문제 야? 쿼리가 너무 느리거나 단순히 임시 테이블을 싫어합니까?

+0

너무 많은 행 (일일 50k +)으로 작업 할 때 임시 테이블을 피하려고합니다. 나는 이것을 몇 일/몇 달/몇 년에 걸쳐 때때로 끌어 내야 할 것입니다. 어쩌면 다른 요약 테이블을 만들 때가 아닐까요? – jwzk

+0

더 많은 데이터를 가지고 더 오랜 기간 동안 필요하다면 요약 테이블을 만드는 것이 좋습니다. MySQL에서이 쿼리 자체를 훨씬 더 간단하게/더 빠르게 얻을 수있는 방법이 없습니다. 아마 당신이'ref.id'에 의해 임시 테이블을 생략 할 수 있다고 명령한다면 그것은 의심 스럽습니다. – Wolph

2

이 쿼리의 의미를 이해하는 데 문제가 있습니다. GROUP BY ref.id있는 경우 왜 GROUP_CONCAT(ref.id)을 사용합니까? 정의에 따라 그룹당 ref.id에 대해 하나의 값만있을 수 있습니다.

sess은 그룹당 time에 대해 여러 값을 가질 수 있지만 입니다. 그룹의 어떤 행을 정렬에 사용 하시겠습니까?

임시 테이블을 호출하는 쿼리는 일반적으로 MySQL에서 성능 문제가 있음에 동의합니다. 임시 테이블은 디스크에 자주 씁니다. 따라서 그룹 & 정렬의 일부로 값 비싼 디스크 I/O를 얻게됩니다.

질문을 편집하고 표 정의 (SHOW CREATE TABLE이 가장 좋음)를 표시 할 수 있습니까? 또한 쿼리가 나타내는 내용을 설명하십시오. 그런 다음 다시 작성하는 방법에 대한 제안을 할 수있는 기회를 갖게 될 것입니다.