6

これらの2つのクエリの間に(明らかに十分なサイズのテーブルの場合)速度の違いがあるかどうかを誰かが知っていますか?

SELECT field FROM table WHERE primary_key = "a particular value"

また:

SELECT field FROM table WHERE primary_key = "a particular value" LIMIT 0,1

primary_keyフィールドは実際には主キーであることに注意してください。

LIMIT 0,1これで、クエリが他の一致を見つけるために続行する場合に役立ちます。ただし、主キーが関係している場合は、その一意性のために自動的に停止するはずだと思います。だから私の推測では、それを追加しても何の利益もありません。

誰かが前にこれに出くわしますか?現在、テストするのに十分な大きさのデータセットがありません。また、に設定されているすべてのフィールドに同じ答えが当てはまると思いますUNIQUE

4

2 に答える 2

8

したがって、Hammerite から提供された情報を読んだ後 (ありがとうございます) explain、両方のクエリを実行すると、次のようになります。

  • ID = 1
  • select_type = シンプル
  • テーブル = テーブル
  • タイプ = 定数
  • possible_keys = プライマリ
  • キー = プライマリ
  • key_len = 767
  • ref = コンスト
  • 行 = 1
  • エクストラ =

これは両方のクエリを として識別CONSTし、リンクは次のように定義します:

定数

テーブルには最大で 1 つの一致する行があり、クエリの開始時に読み取られます。行が 1 つしかないため、この行の列の値は、オプティマイザの残りの部分で定数と見なすことができます。const テーブルは一度だけ読み取られるため、非常に高速です。

したがって、両方のクエリを正しく理解していると仮定すると、それらは同じように扱われます。これは私が予想していたことです。

于 2012-07-04T11:49:14.763 に答える
4

主キーは非常に高速なインデックスとして検索されます。

ただし、クエリを制限することはベスト プラクティスの一部です。

より複雑なクエリでは、Join、Group_by、および order by または単一の検索を使用して、制限レコード row_count が見つかった後、SQL を停止できます。例: 1

order by を使用する場合、sql は、ordered by 列から適切に検索を開始し、その 1 つのレコードが見つかった後に停止できます。他の指定された列または条件内で他のレコードが見つかった場合でも、次のようになります。

SELECT Primary_keycoll,field2 FROM table WHERE Primary_keycoll = "value1" or field2 = 'value1' order by field2 limit 0,1おそらく Primary_keycoll は一意ですが、他の例: field2 は 1 に制限されていない可能性があり、mysql が最初のものを取得して停止することを許可しません。

セキュリティ上の理由から、クエリの最後に limit を使用することをお勧めします。これにより、SQL インジェクションのトリックがブロックされます。リミッターが適切にサニタイズされている限り。

http://dev.mysql.com/doc/refman/5.0/en/limit-optimization.html

LIMIT 0 はすぐに空のセットを返します。

于 2012-10-06T20:56:29.480 に答える