2010-03-05 8 views
0

나는 날짜별로 정렬 된 데이터 묶음을 가지고 있으며 각 테이블은 단 한 달 만의 데이터를 보유하고있다. (이 이유는 질의 시간을 줄이기 위해서 매월 테이블에서 수백만 행에 대해 말하고있는 것입니다.)MySQL 다중 테이블 쿼리

예를 들어,

data_01_2010 holds data from 2010-01-01 to 2010-01-31 
data_02_2010 holds data from 2010-02-01 to 2010-02-28 

때때로 특정 기간에 따라 이러한 표를 쿼리해야합니다. 이제는 범위가 여러 달에 걸쳐있는 경우입니다. 2010-01-01 to 2010-02-28 다음 두 테이블을 모두 쿼리해야합니다.

단일 쿼리로이 작업을 수행 할 수 있습니까? 예를 들어 처럼 :

SELECT * 
FROM data_01_2010, data_02_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 

위의 쿼리의 문제는 열 날짜 열이 두 테이블에 존재 있기 때문에, 어느 모호 말한다는 것이다. (테이블은 같은 구조를 가짐)

이렇게 하나의 쿼리로 달성 할 수 있습니까? 아니면 각 테이블에 대해 별도로 쿼리해야합니까?

답변

0

당신은 당신이 쿼리 필요한 테이블을 알아 내기 위해 다른 논리를 수행하고 매달 동일한 스키마, 당신은 할 수 단지 조합 테이블이있는 경우 :

SELECT * 
FROM data_01_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 
UNION ALL 
SELECT * 
FROM data_02_2010 
WHERE date BETWEEN '2010-01-01' AND '2010-02-28' 

을하지만 당신은 계산하는 쿼리를 필요로하는 경우 어떤 테이블을 조합 할 것인가, 당신은 저장 프로 시저의 영역으로 모험하고 있습니다.

+0

내가 PHP로 작성된 논리를 가지고있다. 나는 결코 UNIONS에 대해 생각하지 않습니다. UNION이 쿼리 성능에 미치는 영향은 무엇입니까? – feketegy

+0

UNION을 사용하면 조금 더 느립니다. 결과를 비교하고 중복을 제거하기 때문입니다. 그러나 UNION ALL은 덤프 검사를 무시합니다. 둘 다 MySQL이 임시 테이블을 생성해야하는데, 약간의 오버 헤드가 있지만 그리 많지는 않습니다. http://www.mysqlperformanceblog.com/2007/10/05/union-vs-union-all-performance/ – adharris

+0

을 참조하십시오. 그러면 아마도 여러 쿼리를 사용하는 것이 더 좋을까요? – feketegy

2

이것은 파티셔닝이 왜 그렇게 강력한 지 보여주는 좋은 예입니다. 파티셔닝을 사용하면 쿼리 성능을 희생하지 않고 논리적으로 모든 테이블을 동일한 테이블에 저장할 수 있습니다. 이 예에서

, 당신은 하나 개 (잘하면 당신이 이것보다 더 나은 이름 것) data라는 테이블과 date 컬럼의 값에 따라 범위 분할을 할 것이다 (다시 희망 당신은 더 나은이 열 이름을 것이다). 내부적으로

SELECT * FROM data WHERE date BETWEEN '2010-01-01' AND '2010-02-28'; 

는 데이터베이스는 where 절에 따라 필요한 파티션에 액세스 : 이것은 당신이 선택하는 간단한하여 요구 사항을 충족 할 수 있다는 것을 의미한다.

참조 : http://dev.mysql.com/doc/refman/5.5/en/partitioning.html

+0

파티셔닝 기능이있는 데이터베이스가 없습니다. 나는 파티셔닝이 여전히 베타 버전이라고 생각합니다. 내가 잘못? – feketegy

+0

파티셔닝은 MySQL 5.1에서 소개되었습니다. –