2

次のようなテーブル構造があるとします。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `username` varchar(16) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `username` (`username`)
);

ユーザー名で検索するときに LIMIT キーワードを使用することに意味はありますか、それとも DB は結果が 1 つしかない可能性があることを認識できるほど賢いので、結果が見つかったら検索を停止しますか?

SELECT * FROM `user` WHERE `username` = 'nick';

-- vs --

SELECT * FROM `user` WHERE `username` = 'nick' LIMIT 1;

更新:回答ありがとうございます。彼らは啓発的でした。不要でLIMIT 1はありますが、クエリを実行しても害はなく、おそらく読みやすさが向上するようです (1 つだけが返されることを知るために DB スキーマを調べる必要はありません)。JRの答えに対する特別な叫び声-インデックスでそれができることさえ知りませんでした。

また、ここで見つけた同様の質問があり、これも役立つ場合があります。

4

3 に答える 3

3

LIMIT を使用する必要はありません。

ただし...テーブルにHUGE HUGE HUGEカーディナリティがある場合(そして速度が心配な場合)、DBで特別なUNIQUE制約を使用せず、アプリケーションから管理することを検討してください。次に、ユーザー名フィールドの最初の数文字だけに INDEX を指定できます。これにより、インデックスのサイズが大幅に縮小され、全体が RAM に収まるようになり、クエリが高速化される可能性があります。

したがって、次のことを試してください。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `username` varchar(16) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `username` (`username`(4))
);

最初の試行が遅すぎることが判明した場合の代替手段として。これはもちろん、挿入する前に重複するユーザー名をチェックする必要があることを意味しますが、別のユーザー名を選択する必要があることをユーザーに伝えるために、おそらくそれを行う必要があります。

使用している DB サーバーとエンジンによっては、すべての文字列に対して固定幅のフィールドを指定する方が高速な場合もあります。varcharの代わりにcharを使用します。

于 2008-10-10T03:57:50.030 に答える
2

私はいつも、LIMIT結果が 1 つだけ必要な場合は必ず を含めるように言われ、読みました。これは、何があっても停止する必要があることをDBに伝えるだけです。あなたの場合、おそらく違いはありませんが、必要なときに一度だけ決定して除外するよりも、常に実行する方が良いと思います。

于 2008-10-10T03:55:25.137 に答える
1

SQLクエリオプティマイザーは、これを理解するのに十分スマートでなければなりません.

于 2008-10-10T03:50:30.230 に答える