[解決済み] MIN/MAXとORDER BY、LIMITの比較
質問
以下のクエリのうち、どの方法がより優れていると思いますか?その理由は何ですか(コード効率、保守性の向上、WTFeryの減少)?
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
どのように解決するのですか?
最悪の場合、インデックスされていないフィールドを見ているような場合は
MIN()
を使うと、テーブルを一回だけフルパスする必要があります。 使用する
SORT
と
LIMIT
はファイルソートを必要とします。 大きなテーブルに対して実行された場合、おそらく認識されるパフォーマンスに大きな違いがあるでしょう。 逸話的なデータポイントとして
MIN()
が 0.36s を要したのに対し
SORT
と
LIMIT
は、私の開発サーバー上の 106,000 行のテーブルに対して 0.84 秒かかりました。
しかし、インデックス付きの列を見ている場合、その差は気づきにくいものです (無意味なデータ ポイントはどちらの場合も 0.00s です)。 しかし、explain の出力を見てみると、次のようになります。
MIN()
は単純にインデックスから最小の値を取り出すことができる(「Select tables optimized away」と「NULL」行)のに対して
SORT
と
LIMIT
はまだインデックス(106,000行)の順序付きトラバースを行う必要があります。 実際のパフォーマンスへの影響はおそらく無視できる程度でしょう。
見た目は
MIN()
は、最悪のケースではより速く、最善のケースでは区別がつかず、標準SQLであり、取得しようとしている値を最も明確に表現しています。 唯一のケースは
SORT
と
LIMIT
が望ましいと思われるのは
mson
が言及したように、任意の列から上位または下位の N 個の値を見つける一般的な操作を書いていて、特殊なケースの操作を書き出す価値がない場合です。
関連
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] MySQL - SELECTクエリに基づくUPDATEクエリ
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] SQLクエリは、複数のテーブルからデータを返す
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】Oracleクエリが順序付け後に返す行数を制限するにはどうすればいいですか?
-
[解決済み] SQLのIN()句の値の順番で並べる
-
[解決済み】SQL Serverでdatetimeの時間部分を削除する最良の方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] SQLの複数列の順序付け
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] SQLでランダムな行を要求する方法は?
-
[解決済み] SQLのインデックスとは何ですか?