Ограничивает ли запрос одной записью повышение производительности - PullRequest
28 голосов
/ 29 августа 2008

Будет ли ограничение запроса одной записью результата улучшать производительность в большой (ish) таблице MySQL, если таблица имеет только один соответствующий результат?

например

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

если есть только одна запись с таким именем? а что если name был первичным ключом / установлен в уникальный? и стоит ли обновлять запрос или выигрыш будет минимальным?

Ответы [ 6 ]

39 голосов
/ 29 августа 2008

Если столбец имеет

уникальный индекс: нет, это не быстрее

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

без индекса: иногда

  • если 1 или более строк соответствуют запросу, yes , поскольку полное сканирование таблицы будет остановлено после сопоставления первой строки.
  • если ни одна строка не соответствует запросу, нет , потому что для этого потребуется выполнить полное сканирование таблицы
4 голосов
/ 29 марта 2009

Если у вас немного более сложный запрос с одним или несколькими объединениями, предложение LIMIT дает оптимизатору дополнительную информацию. Если ожидается совпадение двух таблиц и возврат всех строк, оптимальным является хеш-соединение . Хеш-соединение - это тип соединения, оптимизированный для большого количества совпадений.

Теперь, если оптимизатор знает, что вы передали LIMIT 1, он знает, что он не будет обрабатывать большие объемы данных. Он может вернуться к соединению loop .

На основе базы данных (и даже версии базы данных) это может оказать огромное влияние на производительность.

2 голосов
/ 29 августа 2008

Чтобы ответить на ваши вопросы по порядку: 1) да, если на имени нет указателя. Запрос закончится, как только он найдет первую запись. снять ограничение, и он должен делать полный просмотр таблицы каждый раз. 2) нет. первичные / уникальные ключи гарантированно будут уникальными. Запрос должен прекратиться, как только он найдет строку.

0 голосов
/ 29 марта 2009

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

0 голосов
/ 29 августа 2008

Если «имя» является уникальным в таблице, тогда все равно может быть (очень очень минимальный) выигрыш в производительности, если установить ограничение на ваш запрос. Если имя является первичным ключом, вероятно, его не будет.

0 голосов
/ 29 августа 2008

Я полагаю, что LIMIT - это то, что делается после того, как набор данных найден, а набор результатов создается, поэтому я не ожидаю, что он вообще что-то изменит. Присвоение имени первичному ключу будет иметь существенный положительный эффект, поскольку приведет к созданию индекса для столбца.

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