InnoDB: COUNT(*) vs COUNT(col) в выборке с условием - что быстрее?

Silex

unitecsys
InnoDB: COUNT(*) vs COUNT(col) в выборке с условием - что быстрее?

Всем привет.
Для таблиц InnoDB запрос без условия вида

SELECT COUNT(*) FROM USER
медленнее запроса с условием
SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5

(отсюда http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/)

Будет ли SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5 идентичен по скорости с SELECT COUNT(USER_ID) FROM IMAGE WHERE USER_ID=5 ? USER_ID при этом primary key.
 

Silex

unitecsys
К сожалению, не могу сейчас потестить самостоятельно. Если несложно, можешь запостить параметры теста. Спасибо.
 

Gas

может по одной?
Теста я не проводил, а взял и посмотрел explain 2-х запросов, они абсолютно одинаковые.
С ходу не нашёл таблички чтоб была плохоя селективность индекса, а на хорошей тестировать смысла мало.
 

Роберт

Аналитик
COUNT(col) будет работать медленне чем COUNT(*).
Незначительно , но медленнее...
Причина?
COUNT(*) - просто считает количество записей
COUNT(col) - проверяет значение этого поля и если оно не NULL то увеличивает счётчик.
Не думаю что ты заметишь разницу во времени вычисления , но в зависимости от задачи COUNT(col) и COUNT(*) могут показывать разные значения (хотя в твоём случае врятли primary key будет равен NULL).
Резюме: COUNT(col) работает медленне на время проверки содержимого поля умноженное на количество записей.
 

Gas

может по одной?
быстрее, но практического значения это особо не имеет.
Запустил на 4M записей, среднее время:
count(*) - 6.25 sec
count(id) - 6.354 sec (id - primary key)

проигрыш во втором случае 1.7%, но в рамках всего приложения эти потери будут вообще незаметны.

p.s. это были запросы без условий, просто подсчёт всех записей в таблице.
 
Сверху