0

重複の可能性:
LIMIT 句に大きなオフセットがある MySQL クエリを高速化するにはどうすればよいですか?

私たちのアプリケーションでは、MySQL からのレコードを Web ページに表示しています。そのようなほとんどのアプリケーションと同様に、ページングを使用します。したがって、クエリは次のようになります。

select * from sms_message 
where account_group_name = 'scott' 
and received_on > '2012-10-11' and 
received_on < '2012-11-30' 
order by received_on desc 
limit 200 offset 3000000;

このクエリには 104 秒かかります。オフセットを低いものに変更するか、完全に削除すると、わずか0.5秒です。何故ですか?

複合インデックスは 1 つだけで、account_group_name、received_on、および他の 2 つの列です。テーブルは InnoDB です。

アップデート:

返品について説明する:

1   SIMPLE  sms_message ref all_filters_index   all_filters_index   258 const   2190030 Using where

all_filters_index は、上記の 4 列のフィルターです。

4

1 に答える 1

1

はい、これは本当です。オフセット値が大きくなると時間が長くなります。その理由は、インデックスが作成されていないテーブル内の行の物理的な位置にオフセットが作用するためです。したがって、オフセット x にある行を見つけるには、データベース エンジンは 0 から x までのすべての行を反復処理する必要があります。

于 2012-11-09T19:57:40.530 に答える