@tukal-off

MySQL: count(*) или table_rows или ...?

Доброго времени суток!

Вопрос состоит в следующем:
Имеется регулярно разрастающаяся таблица.
Нужно отслеживать количество строк в ней (скорость наполнения ок. 100 rps).
В определённый момент времени делаю count-запрос и получаю около 27 М строк. Спрашиваю у information_schema - 26 М.
Через n минут (где n < 60) проверяю: count 27 M, table_rows 25 M (ничего не удалялось).
Больше не верю table_rows, но не могу часто использовать count - 45 секунд на выполнение.

Помогите разобраться!
Что я могу использовать? Почему table_rows так себя ведёт?
  • Вопрос задан
  • 387 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
innodb - это MVCC.
Чтобы узнать, сколько строк в таблице - нужно узнать, какие версии строк может видеть эта транзакция. Без вычитывания всех подходящий строк ответ не получить. Разумеется, быстро это работать не будет.
Поэтому данные в information_schema - приблизительная оценка всегда.

Уменьшайте объём данных. Например, если вы растёте по шкале времени, то стройте аггрегаты по времени заранее. Например, по дням и часам. Текущий час s/вычитывать count'ом/инкрементить в каком-нибудь редисе или мемкеше вместе с insert'ами/g,, потом пересчитывать и сохранять к другим аггрегатам.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
savostin
@savostin
Еще один программист
For InnoDB tables, the row count is only a rough estimate used in SQL optimization. (This is also true if the InnoDB table is partitioned.)

Попробуйте так:
SELECT SQL_CALC_FOUND_ROWS * FROM table_name;
SELECT FOUND_ROWS();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы