0

~3.5mio 行の MySQL テーブルがあります。各行を繰り返し処理したい。3.5mio のすべての行をロードしたくないので、クエリを小さなものに分割します。分割には、日付フィールドを使用しています。

問題は次のとおりです。指定された日付よりも大きい行を含むテーブルから選択すると、すべての日付が引き続き検索され、それらが一時的なリストに入れられ、小さな部分だけが必要なため、エントリの 90% がカットされます。

コンピューターがクラッシュしてテーブル全体が読み込まれないように、クエリを作成するにはどうすればよいですか?

4

1 に答える 1

1

簡単な答えはORDER BY、ファイルソート操作を要求するのではなく、インデックスを使用して満足できることを確認することです。

EXPLAIN SELECT ... を使用して、クエリ プランを取得できます。

EXPLAIN
SELECT t.*
  FROM mytable t FORCE INDEX FOR ORDER BY (mytable_IX1)
 WHERE t.created_at > @last_created_at
    OR t.created_at = @last_created_at AND t.id > @last_id
 ORDER BY t.created_at, t.id
 LIMIT 1000


id select_type table  type  possible_keys key         key_len ref    rows Extra        
-- ----------- ------ ----- ------------- ----------- ------- ------ ---- -------------
 1 SIMPLE      t      range mytable_IX1   mytable_IX1 13      (NULL) 1000 Using where; Using index

最初の実行では、t.created_at IS NOT NULL述語のみが必要です。後続の実行では、フェッチした最後の行の列の値を渡すため、その時点から次のクエリを開始します。

于 2012-07-09T21:42:14.350 に答える