32

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

例えば

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

その名前のレコードが 1 つしかない場合は? name主キーが一意に設定されている場合はどうなりますか? クエリを更新する価値はありますか、それとも利益は最小限ですか?

4

6 に答える 6

43

列が

一意のインデックス: いいえ、高速ではありません

一意でないインデックス: おそらく、最初に一致した行を超えて追加の行が送信されないようにするためです (存在する場合)

インデックスなし: 時々

  • 1 つ以上の行がクエリに一致する場合はyesです。これは、最初の行が一致した後に全テーブル スキャンが停止されるためです。
  • クエリに一致する行がない場合、no、完全なテーブル スキャンを完了する必要があるため
于 2008-08-29T15:51:55.847 に答える
4

1 つ以上の結合を含む少し複雑なクエリがある場合、LIMIT 句はオプティマイザに追加情報を提供します。2 つのテーブルが一致し、すべての行が返されることが予想される場合は、通常、ハッシュ結合が最適です。ハッシュ結合は、大量の照合用に最適化された結合の一種です。

オプティマイザーが LIMIT 1 を超えたことを認識した場合、大量のデータを処理しないことがわかります。ループ結合に戻すことができます。

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

于 2009-03-29T18:33:52.347 に答える
2

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

于 2008-08-29T15:55:07.460 に答える
0

LIMIT は、データ セットが見つかり、結果セットが構築された後に行われるものだと思います。そのため、まったく違いはないと思います。名前を主キーにすると、列のインデックスが作成されるため、大きなプラスの効果があります。

于 2008-08-29T15:51:53.130 に答える
0

「名前」がテーブル内で一意である場合でも、クエリに制限制約を設定することで、パフォーマンスが (非常にわずかに) 向上する可能性があります。name が主キーの場合、おそらく存在しません。

于 2008-08-29T15:52:42.817 に答える
0

はい、データを処理するときにパフォーマンスの違いに気付くでしょう。1 つのレコードは、複数のレコードよりも占有するスペースが少なくなります。多くの行を処理していない限り、これは大きな違いではありませんが、クエリを実行すると、データを表示する必要があり、コストがかかるか、プログラムで処理されます。いずれにせよ、複数のレコードよりも 1 つのレコードの方が簡単です。

于 2009-03-29T18:22:37.787 に答える