Какой способ подсчета количества строк должен быть быстрее в MySQL?
Это:
SELECT COUNT(*) FROM ... WHERE ...
Или альтернатива:
SELECT 1 FROM ... WHERE ...
// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()
Можно было бы подумать, что первый метод должен быть быстрее, поскольку это явно территория базы данных, и механизм базы данных должен быть быстрее, чем кто-либо другой, при внутреннем определении подобных вещей.
mysql
performance
Franz
источник
источник
SELECT 1
и нетSELECT *
. Есть разница?mysql_query()
, например, весь набор результатов отправляется в PHP из MySQL, независимо от того, что вы делать с этими данными.Ответы:
Когда вы
COUNT(*)
учитываете индексы столбцов, это будет лучший результат. Mysql с движком MyISAM фактически хранит количество строк, он не считает все строки каждый раз, когда вы пытаетесь подсчитать все строки. (на основе столбца первичного ключа)Использование PHP для подсчета строк не очень разумно, потому что вам нужно отправлять данные из mysql в php. Зачем это нужно, если вы можете добиться того же на стороне mysql?
Если
COUNT(*)
выполняется медленно, вам следует выполнитьEXPLAIN
запрос и проверить, действительно ли используются индексы и куда их следует добавлять.Следующее не самое быстрое способ, но есть случай, когда
COUNT(*)
он не совсем подходит - когда вы начинаете группировать результаты, вы можете столкнуться с проблемой, гдеCOUNT
самом деле не учитываются все строки.Решение есть
SQL_CALC_FOUND_ROWS
. Обычно это используется, когда вы выбираете строки, но вам все равно нужно знать общее количество строк (например, для разбиения на страницы). Когда вы выбираете строки данных, просто добавьтеSQL_CALC_FOUND_ROWS
ключевое слово после SELECT:После того, как вы выбрали нужные строки, вы можете получить счет с помощью этого единственного запроса:
FOUND_ROWS()
должен вызываться сразу после запроса выбора данных.В заключение, все сводится к тому, сколько записей у вас есть и что находится в операторе WHERE. Вам действительно стоит обратить внимание на то, как используются индексы, когда есть много строк (десятки тысяч, миллионы и больше).
источник
MyISAM
сохраняет количество строк. Другие механизмы хранения, напримерInnoDB
, не хранят количество строк и каждый раз подсчитывают все строки .SELECT 1 FROM ... LIMIT 1
илиSELECT COUNT(*) FROM ...
?WHERE
пункт.SELECT COUNT(*) FROM ...
может занять значительное время, в зависимости от того, что нужно сканировать (например, очень большая таблица или индекс из миллионов / миллиардов / триллионов строк).SELECT 1 FROM ... LIMIT 1
немедленно возвращается, потому что вы ограничиваете его первой строкой.После разговора с моими товарищами по команде Рикардо сказал нам, что более быстрый способ:
Но нужно помнить, что результат может быть неточным.
Вы также можете использовать его из командной строки:
Больше информации: http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html
И вы можете найти полное обсуждение в mysqlperformanceblog
источник
SHOW TABLE STATUS
(или эквивалентSELECT
вinformation_schema
) выполняется быстро, но не обрабатываетWHERE
предложения. Это точно для MyISAM, но неточно (иногда с коэффициентом 2) для InnoDB.Отличный вопрос, отличные ответы. Вот быстрый способ повторить результаты, если кто-то читает эту страницу и пропускает эту часть:
источник
as count
?id
сбивает с толку на первый взгляд.Этот запрос (который похож на то, что опубликовал байуах ) показывает красивую сводку всех таблиц в базе данных: (упрощенная версия хранимой процедуры Ивана Качикатари, которую я настоятельно рекомендую).
Пример:
источник
information_schema
, не совпадает с тем, которое возвращаетSELECT count(*) FROM
в случае использования InnoDB. Если вам нужно строгое значение, имейте в виду, что этот метод дает строгое значение только для таблиц MyISAM. В InnoDB количество строк является грубым приближением.Я всегда понимал, что нижеследующее даст мне самое быстрое время ответа.
источник
SELECT 1 ...
вернет столько строк, сколькоWHERE
иLIMIT
запросит, и все они будут равны «1».show table status like '<TABLE NAME>'
Это будет намного быстрее.WHERE
пункт. И для InnoDB это только оценка.Если вам нужно подсчитать весь набор результатов, вы можете использовать следующий подход:
Обычно это не быстрее, чем использование,
COUNT
хотя можно подумать, что все обстоит наоборот, потому что он выполняет внутренние вычисления и не отправляет данные обратно пользователю, поэтому предполагается улучшение производительности.Выполнение этих двух запросов хорошо для разбивки на страницы для получения итогов, но не особенно для использования
WHERE
предложений.источник
Я сделал несколько тестов, чтобы сравнить время выполнения
COUNT(*)
vsCOUNT(id)
(id - это первичный ключ таблицы - индексируется).Количество проб: 10 * 1000 запросов
Полученные результаты:
COUNT(*)
быстрее на 7%СМОТРЕТЬ ГРАФИК: эталонный график
Мой совет - использовать:
SELECT COUNT(*) FROM table
источник
COUNT(1)
, было бы интересно увидеть там некоторые тесты ...Попробуй это:
источник
select count(*) from table_name
или еще что-то. dba.stackexchange.com/questions/151769/…Возможно, вы захотите рассмотреть возможность создания файла
SELECT max(Id) - min(Id) + 1
. Это будет работать, только если ваши идентификаторы являются последовательными и строки не удаляются. Однако это очень быстро.источник
EXPLAIN SELECT id FROM ....
сделал трюк для меня. и я мог видеть количество строк вrows
столбце результата.источник
Я обрабатывал таблицы для правительства Германии, иногда с 60 миллионами записей.
И нам нужно было много раз узнать общее количество строк.
Поэтому мы, программисты баз данных, решили, что в каждой таблице всегда есть запись, в которой хранится общее количество записей. Мы обновили это число в зависимости от строк INSERT или DELETE.
Мы пробовали все другие способы. Это, безусловно, самый быстрый способ.
источник
Оператор count (*) с условием where для первичного ключа возвращал количество строк намного быстрее, что позволило мне избежать полного сканирования таблицы.
Для меня это было намного быстрее, чем
источник