Подтвердить что ты не робот

Рекомендуется ли "LIMIT 1" для запроса, когда условие WHERE основано на PK?

Я запрашиваю базу данных mySQL для извлечения данных из одной конкретной строки. Я использую первичный ключ таблицы как параметр ограничения WHERE.

например.

SELECT name FROM users WHERE userid = 4

Столбец userid является основным ключом таблицы. Хорошо ли использовать LIMIT 1 в конце этой инструкции mySQL? Или есть ли какие-либо преимущества по скорости?

4b9b3361

Ответ 1

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

Кроме того, я не думаю, что он имеет какую-либо выгоду от скорости. Вы можете проверить mySQL Explain для простого инструмента для анализа запроса.

Обратите внимание, как указано в комментариях. LIMIT # имеет скорость и общие преимущества в других случаях, просто не этот.

Ответ 2

Столбец userid является основным ключом таблицы. Хорошо ли использовать LIMIT 1 в конце этой инструкции mySQL? Или есть ли какие-либо преимущества по скорости?

Не рекомендуется использовать LIMIT 1 в конце примера - это совершенно необязательно, потому что столбец userid является первичным ключом. Первичный ключ означает, что в таблице есть только одна строка/запись с этим значением, только одна строка/запись будет когда-либо возвращена.

Но конечным индикатором является план объяснения:

explain SELECT t.name FROM USERS t WHERE t.userid = 4

... возвращает:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

... и:

explain SELECT t.name FROM USERS t WHERE t.userid = 4 LIMIT 1

... возвращает:

id  | select_type | table   | type  | possible_keys  | key      | key_len  |  ref  |  rows  |  Extra
-----------------------------------------------------------------------------------------------------
1   | SIMPLE      | users   | const | PRIMARY        | PRIMARY  | 4        | const | 1      |

Заключение

Никакой разницы, нет необходимости. В этом случае он оптимизирован (только для поиска по первичному ключу).

Предложение LIMIT

Использование LIMIT без ORDER BY приведет к возврату произвольной строки/записи, если возвращается более одного. Например, используя сценарий "Джон Смит", где 2+ человек могут иметь имя "Джон Смит":

SELECT t.userid
  FROM USERS t
 WHERE t.first_name = 'John'
   AND t.last_name = 'Smith'
 LIMIT 1

... риски возвращают любые возможные значения userid, где первое имя - "Джон", а фамилия - "Смит". Нельзя гарантировать, что всегда будет возвращено одно и то же значение, и вероятность получения различного значения каждый раз увеличивается с количеством возможных записей.

Лично я не забочусь об использовании LIMIT. Синтаксис не поддерживается в Oracle, SQL Server или DB2, что делает запросы менее переносимыми. LIMIT - это инструмент, который можно использовать консервативно, а не первое, что вам нужно - знать, когда использовать агрегированные и/или аналитические функции.