0

日付順に並べられた大量のデータがあり、各テーブルには 1 か月分のデータしか保持されません。(これの理由は、クエリ時間を削減するためです。各月のテーブルに何百万行もあると言っています)

例のために。

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 から 2010-02-28 の場合、両方のテーブルにクエリを実行する必要があります。

これは単一のクエリで実現できますか? たとえば、次のようにします。

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

上記のクエリの問題は、列が両方のテーブルに存在するため、列の日付があいまいであることを示していることです。(テーブルは同じ構造です)

これは単一のクエリで達成できますか、それともテーブルごとに個別にクエリする必要がありますか?

4

2 に答える 2

2

これは、パーティショニングが非常に強力である理由の完璧な例です。パーティショニングにより、クエリのパフォーマンスを犠牲にすることなく、すべてのレコードを同じテーブルに論理的に格納できます。

この例では、1 つのテーブルを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

于 2010-03-05T16:57:39.670 に答える
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'

しかし、結合するテーブルを計算するクエリが必要な場合は、ストアド プロシージャの領域に足を踏み入れることになります。

于 2010-03-05T16:46:25.563 に答える