2008-08-29 4 views
24

クエリが1つの結果レコードに限定されますが、テーブルに一致する結果が1つしかない場合、大きな(ish)MySQLテーブルのパフォーマンスが向上しますか?例クエリを1つのレコードに制限するとパフォーマンスが向上する

select * from people where name = "Re0sless" limit 1 

ため

その名前を持つ1つのレコードだけがある場合は?そして、nameがプライマリキー/ユニークに設定されていたらどうなりますか?クエリを更新する価値があるのか​​、それとも最小限の利益になるのでしょうか?

答えて

35

列が

ユニークなインデックスがある場合:いいえ、それは速く

非ユニークなインデックスません:それは一致した最初を超えて任意の追加の行を送信しなくなりますので、多分、を、いずれかが

何のインデックスが存在しない場合:時々

  • 1つ以上の行がクエリと一致する場合は、はいです。最初の行が一致した後に全表スキャンが停止するためです。
  • 行は、「名前」は、テーブルに一意である場合は、全表スキャン
+2

フル・テーブル・スキャンを防止するか、フル・テーブル・スキャンを早期に停止させますか?レコードが存在しない場合は、完全なフル・テーブル・スキャンを実行する必要があります。 –

+2

はい、そうです。それは、それが "完全なテーブルスキャンを防ぐ"ことができると言っているはずです。投稿を調整します –

+4

ここで重要なことは、理解しているように、制限を追加するとクエリが高速になる可能性がありますが、遅くならないことです。他に何もない場合、あなたの状況が思ったほどユニークではない状況をデバッグする必要がある場合に備え、将来の開発者にあなたの意図を明確に伝える役割も果たします。私は常に1つの結果が出るたびに制限句を追加することを習慣にしています。既存のインデックスが既にあなたのためにそれをしていたかどうかを知ることは、無駄な脳の力です。 – GrandOpener

0

データセットが見つかった後にLIMITが実行され、結果セットが構築されているので、私はそれが全く何の違いもないと思っていると思います。主キーを名前にすることは、列に対して索引が作成されるため、有意な正の効果をもたらします。

0

を完了する必要がありますので、その後、まだ(非常に非常に最小限のがあるかもしれない、何の、クエリに一致しない場合)あなたのクエリに制限の制約を置くことでパフォーマンスの向上。 nameがプライマリキーの場合は、存在しない可能性があります。

2

次の順序で質問に答えてください: 1)名前にインデックスがない場合は、はい。クエリは、最初のレコードが見つかるとすぐに終了します。制限を解除し、毎回完全なテーブルスキャンを実行する必要があります。 2)プライマリ/ユニークキーは一意であることが保証されています。クエリが行を見つけたらすぐに実行を停止する必要があります。

0

はい、データを処理するときにパフォーマンスの違いに気づくでしょう。 1つのレコードは、複数のレコードよりも占有スペースが少なくなります。多くの行を扱っている場合を除き、これはあまり違いはありませんが、一度クエリを実行すると、データが表示されなくてはなりません。これはコストがかかります。いずれにしても、1つのレコードは複数のレコードよりも簡単です。

3

もう少し複雑なクエリがあり、1つ以上の結合がある場合、LIMIT句はオプティマイザに余分な情報を与えます。 2つのテーブルを一致させてすべての行を返すと予想される場合は、通常hash joinが最適です。ハッシュ・ジョインは、大量のマッチングのために最適化されたジョインのタイプです。

LIMIT 1を渡したことをオプティマイザが知っている場合、大量のデータを処理しないことがわかります。 loop joinに戻すことができます。

これはデータベース(およびデータベースバージョン)に基づいて、パフォーマンスに大きな影響を与える可能性があります。

関連する問題