1

date500 万行のテーブルがあり、2 つの日付 (date1 と date2) の間にフィールドがある行のみを取得したいと考えています。やってみました

select column from table where date > date1 and date < date2

しかし、処理時間は本当に大きいです。これを行うよりスマートな方法はありますか?行に直接アクセスして、その行の後でのみクエリを作成することはできますか? 私のポイントは、日付期間に一致しないテーブルの大部分を破棄する方法はありますか? または、行ごとに読んで日付を比較する必要がありますか?

4

2 に答える 2

1

いくつかのことを試す/行うことができます:

1.) まだ持っていない場合は、日付列にインデックスを付けます

2.) 日付フィールドでテーブルをレンジ分割する

テーブルをパーティション分割すると、クエリ オプティマイザーは、実際にデータを処理せずにクエリを満たすことができないパーティションを削除できます。

たとえば、毎月の日付フィールドでテーブルを分割し、テーブルに 6 か月分のデータがあるとします。2012 年 10 月から 2012 年 10 月までの範囲の日付に対してクエリを実行すると、クエリ オプティマイザーは 6 つのパーティションのうち 5 つを除外し、2012 年の 10 月のレコードを含むパーティションのみをスキャンする可能性があります。

詳細については、MySQL パーティショニングのページを確認してください。必要なすべての情報を提供し、上記の「パーティションのプルーニング」セクションで説明したことの詳細な例を示します。

新しいパーティション分割されたテーブルでテーブルを作成/複製し、クエリを実行して結果をテストし、それが要件を満たしているかどうかを確認することをお勧めします。日付列にまだインデックスを作成していない場合は、最初のステップとしてテストし、必要に応じてパーティショニングを確認してください。

于 2012-10-16T19:59:22.070 に答える
1

通常、結果を取得する前に何らかの条件を適用します。フィルタリングするものが何もない場合はLIMIT、 andを使用できOFFSETます。

SELECT * FROM table_name WHERE date BETWEEN ? AND ? LIMIT 1000 OFFSET 1000

通常LIMIT、特定のページに表示したいレコードの量に制限はありません。

于 2012-10-16T19:49:00.640 に答える