1. ホーム
  2. sql

[解決済み] MIN/MAXとORDER BY、LIMITの比較

2022-09-16 09:14:54

質問

以下のクエリのうち、どの方法がより優れていると思いますか?その理由は何ですか(コード効率、保守性の向上、WTFeryの減少)?

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

どのように解決するのですか?

最悪の場合、インデックスされていないフィールドを見ているような場合は MIN() を使うと、テーブルを一回だけフルパスする必要があります。 使用する SORTLIMIT はファイルソートを必要とします。 大きなテーブルに対して実行された場合、おそらく認識されるパフォーマンスに大きな違いがあるでしょう。 逸話的なデータポイントとして MIN() が 0.36s を要したのに対し SORTLIMIT は、私の開発サーバー上の 106,000 行のテーブルに対して 0.84 秒かかりました。

しかし、インデックス付きの列を見ている場合、その差は気づきにくいものです (無意味なデータ ポイントはどちらの場合も 0.00s です)。 しかし、explain の出力を見てみると、次のようになります。 MIN() は単純にインデックスから最小の値を取り出すことができる(「Select tables optimized away」と「NULL」行)のに対して SORTLIMIT はまだインデックス(106,000行)の順序付きトラバースを行う必要があります。 実際のパフォーマンスへの影響はおそらく無視できる程度でしょう。

見た目は MIN() は、最悪のケースではより速く、最善のケースでは区別がつかず、標準SQLであり、取得しようとしている値を最も明確に表現しています。 唯一のケースは SORTLIMIT が望ましいと思われるのは mson が言及したように、任意の列から上位または下位の N 個の値を見つける一般的な操作を書いていて、特殊なケースの操作を書き出す価値がない場合です。