1

〜400のテーブルを持つDBがあります。それぞれに 1M ~ 200M 行の 5 つの列があります。列の 1 つは DATE 値であり、1 つのインデックスです。(別のユニークキーもあります)。

「select * from table where <date field> = ?」を実行してこれらのテーブルをウォークスルーする場合 応答時間は、日付が行ごとに来る場所に比例することがわかりました。IE で最も古い日付が「2001-01-01」の場合、最新の日付は「2010-12-01」であり、2001 年よりも 2010 年の方がはるかに遅い各日付の行数はほぼ同じです。

データは、日付の昇順でテーブルに書き込まれます (PK 値が小さいほど、日付が早い)。

選択で「desc」を実行すると、適切なインデックスが使用され、適切な数の値が取得されていることが示されます。

これは予想される動作ですか?

4

1 に答える 1

0

それらに対して ANALYZE または OPTIMIZE TABLE を実行してみましたか? おそらく、インデックスの再構築が必要です。

以前に試したことはありませんが、解決策として見たことがあるのは、日付を3つの別々のフィールドに分割することです: thisYear YEAR、
thisMonth TINYINT、
thisDate TINYINT

インデックス:
INDEX dateIDX (thisYear, thisMonth, thisDate)

これらを検索します:
WHERE thisYear = 2001 AND thisMonth = 1 AND thisDate = 1

MySQL 5.1 以降を使用している場合は、データのパーティション分割を試すことができます。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html 以前のバージョンでは、MERGE テーブルも役立つ場合があります。

于 2012-10-15T13:39:18.923 に答える