3

170,000 レコードのハグ テーブルがあります。

このクエリの違いは何ですか

Showing rows 0 - 299 (1,422 total, Query took 1.9008 sec)
    SELECT 1 FROM `p_apartmentbuy` p 
    where 
    p.price between 500000000 and 900000000
    and p.yard = 1
    and p.dateadd between 1290000000 and 1320000000
    ORDER BY `p`.`id` desc
    limit 1669

説明 ここに画像の説明を入力

そしてこれ:

Showing rows 0 - 299 (1,422 total, Query took 0.2625 sec)
    SELECT 1 FROM `p_apartmentbuy` p 
    where 
    p.price between 500000000 and 900000000
    and p.yard = 1
    and p.dateadd between 1290000000 and 1320000000
    ORDER BY `p`.`id` desc
    limit 1670

説明: ここに画像の説明を入力

これらのクエリは両方とも、同じデータを持つ 1 つのテーブルを使用しており、where clasue は同じですが、制限行数のみが異なります

4

2 に答える 2

3

MySQL にはソート用のバッファがあります。ソートするものが大きすぎる場合、チャンクをソートしてからマージソートします。これを「ファイルソート」と呼びます。1670 番目の行がソート バッファをオーバーフローしているようです。

詳細はこちらをご覧ください。

なぜメモリ内ソートに別のキーを選択するのか...よくわかりません。しかし、最終的に遅くなるため、明らかにその戦略はあまり良くありません。

于 2012-04-09T16:00:17.557 に答える