MySQL InnoDB count (*) против подсчета строк на стороне сервера - PullRequest
1 голос
/ 08 июня 2011

У меня есть таблица Myno InnoDB.Мне нужно посчитать количество строк в таблице, но я прочитал во многих книгах по настройке производительности, что подсчет () выполняется не очень быстро.Будет ли быстрее подсчитать количество строк с помощью select count () или с помощью Select Primary_key_column и подсчета строк на стороне сервера?Или есть другая альтернатива для подсчета количества строк, которая не вызывает проблем с производительностью в MySql InnoDB?

Ответы [ 3 ]

2 голосов
/ 08 июня 2011

в случае COUNT(*) всей таблицы MyISAM работает очень быстро, поскольку сохраняет внутреннее количество строк таблицы.

В случае COUNT(*) ... WHERE ... оба MyISAM и InnoDB должны действительно считать соответствующие строки.Тогда скорость зависит главным образом от количества дискового ввода-вывода, необходимого для доступа к строкам.

MyISAM хранит внутренний кеш метаданных таблицы, например, количество строк.Это означает, что, как правило, COUNT(*) не требует дополнительных затрат для хорошо структурированного запроса. InnoDB , однако, не имеет такого кэша.Для конкретного примера, скажем, мы пытаемся разбить запрос на страницы.Если у вас есть запрос SELECT * FROM users LIMIT 5,10, скажем, запуск SELECT COUNT(*) FROM users LIMIT 5,10 по существу бесплатен с MyISAM , но занимает столько же времени, сколько и первый запрос с InnoDB . MySQL имеет опцию SQL_CALC_FOUND_ROWS, которая сообщает InnoDB , чтобы вычислить количество строк при выполнении запроса, который затем можно получить, выполнив SELECT FOUND_ROWS().Это очень MySQL -специфично, но может быть необходимо в определенных ситуациях, особенно если вы используете InnoDB для других его функций (например, блокировки на уровне строк, хранимых процедур и т. Д.).

1 голос
/ 08 июня 2011

SELECT COUNT(*) FROM table всегда быстрее, чем подсчет записей «вручную» (например, выборка только столбца первичного ключа и подсчет длины массива, скажем, в PHP).

В какой книге ты это прочитал?

1 голос
/ 08 июня 2011

Я говорю вообще - если вы используете count на стороне клиента, он должен быть таким же, как если бы вы запускали его на стороне сервера.Это связано с тем, что оператор sql отправляется из клинета (или сервера) на сервер базы данных и выполняет операцию всегда на стороне сервера.

Однако рекомендуется использовать индекс для подсчета подмножеств всех данных,но если вы подсчитываете все данные в таблице, индексы будут устаревшими, поскольку БД должна считать ВСЕ строки.

Я не знаю, есть ли в mysql утилита runstats.В DB2, например, статистика также сообщает количество записей в таблице ... и после выполнения runstats счет намного быстрее.

...