2008-10-10 3 views
2

Учитывая структуру таблицы, как это:Использование LIMIT при поиске по уникальной области

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; 

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

Кроме того, есть аналогичный вопрос, который я нашел here, что также может помочь.

ответ

2

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

1

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

+0

:-D «должно» приятно, но не ответ – 2011-07-27 10:42:43

3

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

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

Таким образом, вы можете попробовать:

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.