Задавайте вопросы, мы ответим
Вы не зашли.
Доброго дня, Коллеги!
Хочу посоветоваться по след. вопросу:
mysql 5.6, есть таблица innodb с сотнями миллионов записей.
Типы данных в таблице bigint unsigned, char(64), int, timestamp, то есть поля с фикс. длиной.
естественно, select count(*) работает медленно, секунд 30.
Записи только пополняются, удаляются крайне редко.
Возникает вопрос про быстрый доступ к этой инфе (количеству записей в таблице). Условие WHERE не нужно.
Прежде чем делать кеширование count(*) (триггерами или из приложения) хочу попробовать "штатные" читерские средства СУБД.
честный count(*) возвращает
243,872,470
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mytable'; возвращает
240,487,134
select DATA_LENGTH/AVG_ROW_LENGTH from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mytable'; возвращает
242,285,584
show table status like 'mytable'; в поле rows возвращает
240,487,134
Собственно вопрос - стоит ли пользоваться каким-либо из неcount(*)-методов (и если да, то каким из трех приведенных) и гарантируется ли разработчиками СУБД какая-то точность? Отклонение в пределах миллиона для нас в целом допустимо в рамках этой задачи, но хотелось бы представлять. Если есть какой-нибудь пруф на эти слова в доке - буду признателен.
Неактивен
Про TABLE_ROWS задокументировано, что это грубая оценка:
https://dev.mysql.com/doc/refman/5.6/en/tables-table.html написал:
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.)
Согласно обсуждению на stackoverflow, на точность можно повлиять параметром innodb_stats_persistent_sample_page.
https://stackoverflow.com/questions/333 … mber-of-ro
Про DATA_LENGTH/AVG_ROW_LENGTH в документации ничего не сказано, поэтому на свой страх и риск. Возможно, что при некоторых обстоятельствах это даже грубой оценкой не будет.
Неактивен
Спасибо! Да, неутешительно.. Видимо, придется напрячься и делать счетчик самому, триггером или из приложения.
Неактивен
А вообще хитры, конечно, составители документации .
is only a rough estimate
и делай выводы как хочешь. Даже отклонение в 2 раза - а чего, грубая оценка, все сходится.
Неактивен
В Innodb некоторый алгоритм оценки, точность которого можно узнать, прочитав исходники. У этой оценки много недостатков. Так, алгоритм не гарантирует монотонности ответа, если данные только добавляются.
Неактивен
Понял, ну, значит не всегда получится схалявить, как я хотел было поначалу ): .
paulus следующее сказал:
Если нужно точное число, то денормализовывать. Оценки, которые делает mysql, обычно достаточно точные — он делает несколько спусков по дереву в рандомных местах и апроксимирует результат. эта же оценка используется для выбора плана выполнения запроса, поэтому она достаточно надежна.
Тем не менее, иногда она может сбоить совсем неудачно (особенно, когда у тебя индекс с дырками).
Неактивен