MIN / MAXとORDER BYおよびLIMIT


99

次のクエリのうち、どちらの方法が適切だと思いますか?あなたの理由は何ですか(コード効率、保守性の向上、WTFeryの削減)...

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

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

回答:


125

最悪の場合、インデックス付けされていないフィールドを参照MIN()する場合、を使用するには、テーブルの完全な単一パスが必要です。使用SORTしてLIMIT、filesortが必要です。大きなテーブルに対して実行した場合、予想されるパフォーマンスに大きな違いが生じる可能性があります。無意味なデータポイントとして、MIN().36sしばらく時間がかかったSORTし、LIMIT私のdevのサーバー上で106000行のテーブルに対して.84sを取りました。

ただし、インデックス付きの列を見ている場合、違いはわかりにくいです(無意味なデータポイントはどちらの場合も0.00秒です)。ただし、explainの出力を見ると、MIN()インデックスから最小値(「選択されたテーブルを最適化して削除」と「NULL」行)を単純に抽出できるように見えますがSORTLIMITそれでも、インデックスの順序付けられた走査を実行する必要があります(106,000行)。実際のパフォーマンスへの影響はおそらく無視できます。

それはMIN()進むべき道のように見えます-最悪の場合はより速く、最良の場合は区別がつかず、標準SQLであり、取得しようとしている値を最も明確に表現します。msonが述べたように、使用SORTしてLIMIT望ましいと思われる唯一のケースは、任意の列から上位または下位のN値を見つける一般的な操作を記述していて、特殊なケースの操作を記述する価値がない場合です。


7
1つの単一パスのo(n)と並べ替えの0(nlogn)
Abhishek Iyer

1
@AbhishekIyerあなたは完全に正しいですが、「インデックス付けされていないフィールドの最悪の場合」を追加します。
dmikam 2015

インデックス付けされていない最悪のケースに関するその部分は間違っています。常にフルスキャンが必要ですが、それ以外に最小または最大であることをどのようにして知ることができますか?それはあなたがスキャンしているようなものではなく、値が叫びます:「ねえ、あなたはついに私を見つけました!私はジャックです、最高です!」。
Robo Robok

4億7000万行のインデックス付きテーブルを使用したテストでは、両方のクエリに0.00秒かかります。ただし、クエリにフィルター "WHERE field2 = x"を追加した場合、LIMITを使用したクエリにも0.00秒かかり、MINを使用したクエリには0.21秒かかります。
AntonioCañasVargas

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

単にANSI互換だからです。TOPはSQL Serverに対するものなので、制限1はMySqlに固有です。


ほとんどのDBMSは、制限/オフセットまたは同等、それは私が上で働いているアプリケーションの大部分で使用されてきた(MINの代替としてではないが、そのようなページネーションなど、他の目的のために。)
finnw

@finnw-同意しますが、質問者の例では、制限をminと明示的に比較していました。
のOtavioDécio

9

以下のようMSONショーンMcSomethingが指摘されている、MINが好ましいです。

ORDER BY + LIMITが役立つもう1つの理由は、MIN列とは異なる列の値を取得する場合です。

例:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

4

答えはあなたがしていることに依存すると思います。

1回限りのクエリがあり、インテントが指定したとおりに単純である場合は、select min(field)が推奨されます。

ただし、これらのタイプの要件を、「上位n件の結果を取得」、「n番目-m番目の結果を取得」などに変更することは一般的です。

選択したデータベースにコミットするのはそれほどひどい考えではないと思います。dbの変更は軽く行うべきではなく、変更する必要があります。この移動を行うときに支払う価格です。

なぜ今あなた自身を制限するのか、あなたが後に感じるかもしれないし、感じないかもしれない痛みのために?

ANSIをできるだけ維持することは良いことだと思いますが、それは単なるガイドラインです...


3

許容できるパフォーマンスを考えると、意味的に目的に近いので、最初のものを使用します。
パフォーマンスに問題がある場合(ほとんどの最新のオプティマイザーは、おそらく両方を同じクエリプランに最適化しますが、テストして検証する必要があります)、もちろん、より高速なものを使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.