0

不可解なタイトルで申し訳ありません...私の問題:

最も単純化された形式で次のようになるmysqlクエリがあります。

SELECT * FROM table 
WHERE _SOME\_CONDITIONS_
ORDER BY `id` DESC
LIMIT 50

この句がないLIMITと、クエリは約 50,000 行を返しますが、最初の 50 行だけに関心があります。ここで、ORDER BYMySQL が一時テーブルを作成し、そこにすべての結果をロードし、50,000 個の結果を並べ替える必要があることを追加したため、最初の 50 個の結果を返すことができることに気付きました。

このクエリとそれを使用しないクエリのパフォーマンスを比較するORDER BYと、1.8 秒と 0.02 秒という驚異的な違いが得られます。

それidが主キーの自動インクリメントであることを考えると、私の問題にはエレガントな回避策があるはずだと思いました。ありますか?

4

1 に答える 1

0

SOME_CONDITIONS は、クエリに ID 範囲を与えることができるようなものですか? 少なくとも、ソート前に一時テーブルに追加される行数を制限できます。

例えば:

SELECT * FROM table 
WHERE _SOME\_CONDITIONS_
AND id BETWEEN 1 AND 50;

あるいは、 SOME_CONDITIONSが原因で、結果の ID の範囲についてこの種の仮定を行うことができない場合は、最小 ID と最大 ID を与えるネストされたクエリを使用することもできます。

パフォーマンスが本当に重要な場合は、最初の 50 件の結果の別のテーブルまたはキャッシュを作成し、それを個別に更新することで、データを非正規化します。

于 2013-09-16T22:44:22.580 に答える