Использование LIMIT при поиске по уникальному полю - PullRequest
2 голосов
/ 10 октября 2008

С учетом структуры таблицы, подобной этой:

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 при поиске по имени пользователя, или БД достаточно умна, чтобы знать, что может быть только один результат, и, следовательно, прекратить поиск, если он найден?

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

-- vs --

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

Обновление: Спасибо за ответы, они были полезны. Кажется, даже если это и не нужно, добавление LIMIT 1 к запросу не повредит и, вероятно, повысит читабельность (вам не нужно заглядывать в схему БД, чтобы узнать, что будет возвращена только одна). Специальный крик для ответа JR: я даже не знал, что вы можете сделать это с помощью индексов.

Также есть похожий вопрос, который я нашел здесь , который также может помочь.

Ответы [ 3 ]

3 голосов
/ 10 октября 2008

Нет необходимости использовать LIMIT.

Однако ... Если у вас на столе ОГРОМНО ОГРОМНОЕ ОГРОМНОЕ количество элементов (и вас беспокоит скорость), вы можете подумать о том, чтобы не использовать специальное ограничение UNIQUE в БД и управлять им из своего приложения. Затем вы можете указать ИНДЕКС только для первых нескольких символов вашего поля имени пользователя. Это резко сократит размер вашего индекса, будучи уверенным, что все это помещается в ОЗУ, и, возможно, ускорит ваши запросы.

Итак, вы можете попробовать:

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))
);

в качестве альтернативы, если ваша первая попытка окажется слишком медленной. Это означает, что вам, конечно, нужно проверять дубликаты имен пользователей перед вставкой, но вам, вероятно, придется делать это в любом случае, чтобы сообщить пользователю, что ему нужно выбрать другое имя пользователя.

В зависимости от того, какой сервер БД и какой движок вы используете, также может быть быстрее указать поля фиксированной ширины для всех ваших строк. Вместо varchar используйте char .

2 голосов
/ 10 октября 2008

Мне всегда говорили и читали, что вы должны включать LIMIT каждый раз, когда вам нужен только 1 результат. Это просто говорит БД, что она должна остановиться, несмотря ни на что. В вашем случае, вы, вероятно, правы, это не имеет значения, но я думаю, что лучше просто всегда делать, чем всегда принимать решение и оставлять его один раз, когда вам это нужно.

1 голос
/ 10 октября 2008

Оптимизатор SQL-запросов должен быть достаточно умным, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...