“ПРЕДЕЛ 1” рекомендуемый для запроса где, ГДЕ условие основано на PK?

И IEEE и ACM производят много хороших вычислительных журналов, которые могли бы представлять интерес в зависимости от Ваших точных процентов. Я - подписчик на обоих.

22
задан Lightness Races with Monica 11 December 2011 в 20:51
поделиться

2 ответа

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

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

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

24
ответ дан 29 November 2019 в 04:57
поделиться

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

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

Но окончательный индикатор - это план объяснения:

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 вернет произвольную строку / record, если возвращено более одного. Например, при использовании сценария «Джон Смит», где 2+ человека могут иметь имя «Джон Смит»:

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

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

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

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

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

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

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

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

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

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

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

13
ответ дан 29 November 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: