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程度でしょうが、サイズは来年1回あたり約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

ここではストアドプロシージャに代わる方法はありません。あなたのテーブルの構造を考えると、そこには高負荷があります。

関連する問題