MySQL: самый быстрый способ подсчета количества строк




performance (8)

Возможно, вам захочется рассмотреть возможность выполнения SELECT max(Id) - min(Id) + 1 . Это будет работать, только если ваши идентификаторы являются последовательными, а строки не удаляются. Это очень быстро.

Какой способ подсчета числа строк должен быть быстрее в 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()

Можно было бы подумать, что первый метод должен быть быстрее, так как это явно база данных, а механизм базы данных должен быть быстрее, чем кто-либо другой при определении таких вещей, как это внутренне.


Если вам нужно получить подсчет всего набора результатов, вы можете воспользоваться следующим подходом:

SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5;
SELECT FOUND_ROWS();

Это обычно не быстрее, чем при использовании COUNT хотя можно подумать, что обратное имеет место, потому что он выполняет внутренние вычисления и не отправляет данные обратно пользователю, тем самым подозревается улучшение производительности.

Выполнение этих двух запросов полезно для разбивки на страницы для получения итогов, но не особенно для использования WHERE .


Отличный вопрос, отличные ответы. Вот быстрый способ повторить результаты, если кто-то читает эту страницу и пропускает эту часть:

$counter = mysql_query("SELECT COUNT(*) AS id FROM table");
$num = mysql_fetch_array($counter);
$count = $num["id"];
echo("$count");

Поговорив с моими товарищами по команде, Рикардо сказал нам, что более быстрый способ:

show table status like '<TABLE NAME>' \G

Но вы должны помнить, что результат может быть не точным.

Вы также можете использовать его из командной строки:

$ mysqlshow --status <DATABASE> <TABLE NAME>

Дополнительная информация: http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html

И вы можете найти полное обсуждение в mysqlperformanceblog


Этот запрос (который похож на то, что выложили байюа) показывает хорошее резюме всех таблиц, подсчитываемых внутри базы данных: (упрощенная версия хранимой процедуры Ivan Cachicatari, которую я очень рекомендую).

SELECT TABLE_NAME AS 'Table Name', TABLE_ROWS AS 'Rows' FROM information_schema.TABLES WHERE TABLES.TABLE_SCHEMA = ' YOURDBNAME ' AND TABLES.TABLE_TYPE = 'BASE TABLE' ;

Пример:

+-----------------+---------+ | Table Name | Rows | +-----------------+---------+ | some_table | 10278 | | other_table | 995 |


Я всегда понимал, что приведенное ниже даст мне самые быстрые ответы.

SELECT COUNT(1) FROM ... WHERE ...

EXPLAIN SELECT id FROM .... сделал трюк для меня. и я мог видеть количество строк в столбце rows результата.


Я сделал несколько тестов, чтобы сравнить время выполнения COUNT(*) и COUNT(id) (id - первичный ключ индексированной таблицы).

Количество испытаний: 10 * 1000 запросов

Результаты: COUNT(*) быстрее 7%

ПРОСМОТРЕТЬ ГРАФ: benchmarkgraph

Мой совет заключается в использовании: SELECT COUNT(*) FROM table





performance