SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.08.2017 14:41:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Количество записей в большой innodb-таблице

Доброго дня, Коллеги!

Хочу посоветоваться по след. вопросу:

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(*)-методов (и если да, то каким из трех приведенных) и гарантируется ли разработчиками СУБД какая-то точность? Отклонение в пределах миллиона для нас в целом допустимо в рамках этой задачи, но хотелось бы представлять. Если есть какой-нибудь пруф на эти слова в доке - буду признателен.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 04.08.2017 14:52:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Количество записей в большой innodb-таблице

Про 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 в документации ничего не сказано, поэтому на свой страх и риск. Возможно, что при некоторых обстоятельствах это даже грубой оценкой не будет.

Неактивен

 

#3 04.08.2017 14:58:55

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество записей в большой innodb-таблице

Спасибо! Да, неутешительно.. Видимо, придется напрячься и делать счетчик самому, триггером или из приложения.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 04.08.2017 15:19:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество записей в большой innodb-таблице

А вообще хитры, конечно, составители документации smile.

is only a rough estimate

и делай выводы как хочешь. Даже отклонение в 2 раза - а чего, грубая оценка, все сходится.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 04.08.2017 16:08:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Количество записей в большой innodb-таблице

В Innodb некоторый алгоритм оценки, точность которого можно узнать, прочитав исходники. У этой оценки много недостатков. Так, алгоритм не гарантирует монотонности ответа, если данные только добавляются.

Неактивен

 

#6 04.08.2017 19:13:13

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество записей в большой innodb-таблице

Понял, ну, значит не всегда получится схалявить, как я хотел было поначалу ): .

paulus следующее сказал:

Если нужно точное число, то денормализовывать. Оценки, которые делает mysql, обычно достаточно точные — он делает несколько спусков по дереву в рандомных местах и апроксимирует результат. эта же оценка используется для выбора плана выполнения запроса, поэтому она достаточно надежна.
Тем не менее, иногда она может сбоить совсем неудачно (особенно, когда у тебя индекс с дырками).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson