Рекомендуется ли "LIMIT 1" для запроса, когда условие WHERE основано на PK?
Я запрашиваю базу данных mySQL для извлечения данных из одной конкретной строки. Я использую первичный ключ таблицы как параметр ограничения WHERE.
например.
SELECT name FROM users WHERE userid = 4
Столбец userid является основным ключом таблицы. Хорошо ли использовать LIMIT 1 в конце этой инструкции mySQL? Или есть ли какие-либо преимущества по скорости?
Ответы
Ответ 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 - это инструмент, который можно использовать консервативно, а не первое, что вам нужно - знать, когда использовать агрегированные и/или аналитические функции.