2011-07-26 4 views
6

안녕하세요 개발자 동일한 구조로 여러 테이블에서 행을 빠르게 선택하는 방법을 연구하고 있습니다. 테이블에 너무 많은 데이터가있어 1 개의 테이블이 아닙니다. 따라서 모든 테이블에는 1 개월 동안의 데이터가 포함됩니다. 예를 들어 log_2011_01, log_2011_02 등이 있습니다. 테이블의 날짜 시간 열은 created_at입니다.동일한 테이블에서 검색을위한 mysql 저장 프로 시저

저장 프로 시저를 만들려면이 날짜와 그 밖의 몇 가지 항목을 검색하기위한 2 개의 datetime 매개 변수가 있어야합니다.

이제는 다음 실현을 참조하십시오. 저장 프로 시저는 2 개의 날짜 사이에서 테이블 컬렉션을 계산하고 SQL을 생성하여 union_all로 데이터를 선택해야합니다. 나는 무겁게 될 것이라고 생각하고 과부하 상태가 될 준비가되어 있지 않습니까? 다른 방법이 있습니까? 감사합니다.

+6

이것은 한 달에 별도의 테이블 대신 분할 된 테이블을 사용해야했던 것과 같습니다. 날짜별로 범위 분할을 사용하는 것을 알고 있습니까? – searlea

+1

@ Fivell : 궁금한 점은 "너무 많이"무엇입니까? –

+0

@ypercube : 아이디어가 없습니다. 어쩌면 5-10GB 정도 되겠지만 크기는 내년에 약 10 배 증가 할 것입니다. – Fivell

답변

2

다른 의견과 동의하지만 SP를 통해 도움을 드렸습니다. 이 SP는 prepared statements으로 실행할 수있는 쿼리를 작성합니다.

-- SP definition: 

DELIMITER $$ 

CREATE PROCEDURE iterateMonths(IN fromDate DATE, IN toDate DATE) 
BEGIN 
    DECLARE tempDate DATE; 
    DECLARE query VARCHAR(1000); -- Query string, length might be increased 

    SET tempDate = fromDate - INTERVAL (dayofmonth(fromDate) - 1) DAY; 

    WHILE tempDate <= toDate 
    DO 

    IF query IS NOT NULL THEN 
     SET query = concat(query, '\r\nUNION ALL\r\n'); 
    ELSE 
     SET query = ''; 
    END IF; 

    SET query = concat(query, 'SELECT * FROM log_', DATE_FORMAT(tempDate, '%Y_%m')); 
    SET tempDate = tempDate + INTERVAL 1 MONTH; 
    END WHILE; 

    SELECT query; -- Output generated query 
END 
$$ 

DELIMITER ; 

-- Call the SP 

SET @fromDate = '2010-07-29'; 
SET @toDate = '2011-08-29'; 
CALL iterateMonths(@fromDate, @toDate); 

-- Output: 

SELECT * FROM log_2010_07 
UNION ALL 
SELECT * FROM log_2010_08 
UNION ALL 
SELECT * FROM log_2010_09 
UNION ALL 
SELECT * FROM log_2010_10 
UNION ALL 
SELECT * FROM log_2010_11 
UNION ALL 
SELECT * FROM log_2010_12 
UNION ALL 
SELECT * FROM log_2011_01 
UNION ALL 
SELECT * FROM log_2011_02 
UNION ALL 
SELECT * FROM log_2011_03 
UNION ALL 
SELECT * FROM log_2011_04 
UNION ALL 
SELECT * FROM log_2011_05 
UNION ALL 
SELECT * FROM log_2011_06 
UNION ALL 
SELECT * FROM log_2011_07 
UNION ALL 
SELECT * FROM log_2011_08 
+0

내 SP가 오래 전에 준비되었지만 어쨌든 고마워요 – Fivell

+0

현상금을 보내 주셔서 감사합니다. – Devart

0

저장 프로 시저 대신 사용할 수있는 것은 없습니다. 테이블의 구조를 고려하면 과부하가있을 것입니다.