Mysql count против mysql SELECT, какой из них быстрее? - PullRequest
14 голосов
/ 02 ноября 2009

Если я хочу проверить имя, я хочу увидеть, сколько строк / имен существует в столбце «имя пользователя» в таблице пользователей. Скажем, тысячи ... сотни тысяч, я должен использовать:

  • количество (имя),

  • count (*) или

  • ВЫБЕРИТЕ имя пользователя из числа пользователей, где имя пользователя = 'имя'

Какой из них более уместен? Или они дадут одинаковый результат в плане скорости / реакции?

EDIT:

Спасибо, ребята, я нашел ответ, count () определенно быстрее

Корректен ли этот запрос

SELECT COUNT( username )
FROM users
WHERE `username` = 'tim' 

Ответы [ 5 ]

21 голосов
/ 02 ноября 2009

COUNT(*) и COUNT(Name) могут давать разные значения. COUNT не будет включать значения NULL, поэтому, если есть какие-либо экземпляры Name , равные NULL, они не будут учитываться.

COUNT(*) также будет работать лучше, чем Count(Name). Указав COUNT(*), вы оставляете оптимизатор свободным для использования любого индекса, который он пожелает. Указывая COUNT(Name), вы заставляете механизм запросов использовать таблицу или хотя бы индекс, содержащий столбец NAME.

3 голосов
/ 02 ноября 2009

COUNT (имя) или COUNT (*) будет несколько быстрее, потому что им не нужно возвращать много данных. (см. ответ Эндрю Шепарда о семантической разнице между этими двумя формами COUNT, а также COUNT ()). Основное внимание уделяется «проверке имени», эти различия не имеют большого значения с помощью следующего трюка: вместо подсчета вы также можете использовать

SELECT username FROM users where username = 'name' LIMIT 1;

Который будет иметь эффект проверки (существования) имени, но вернется, как только будет найдено одно имя.

1 голос
/ 02 ноября 2009

Счетчик (*) будет быстрее, поскольку движок MySQL может свободно выбирать индекс для подсчета.

0 голосов
/ 02 ноября 2009

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

Я бы сказал, что вы должны использовать select top 1, но вы проверяете имя пользователя, которое, вероятно, является индексированным уникальным столбцом, так что теоретически count должен также преформироваться, учитывая, что может быть только один.

0 голосов
/ 02 ноября 2009

Оператор Select генерирует больше трафика, если много пользователей с одинаковыми именами (множество строк вместо одного).

...