Фон
Итак, я понимаю, что для таблиц InnoDB table_rows
из information_schema
является лишь приблизительной оценкой, и что подсчет точного количества строк нетривиален из-за транзакций.
Но у меня есть некоторые таблицы, для которых table_rows
находится в пределах нескольких % от истинного количества, и некоторые таблицы, подобные этой:
mysql> SELECT table_rows FROM information_schema.tables WHERE table_name="__unit_previews";
+------------+
| table_rows |
+------------+
| 226992266 |
+------------+
1 row in set (0.03 sec)
mysql> SELECT COUNT(*) FROM __unit_previews;
+----------+
| COUNT(*) |
+----------+
| 144156 |
+----------+
1 row in set (0.14 sec)
Я думаю, вы должны быть очень великодушны, чтобы назвать это приблизительной оценкой.
Открытых сделок нет; Я не удалял тайно несколько сотен миллионов строк; Я запустил analyze table
, чтобы убедиться, что информационная схема актуальна.
Я использую MySQL 5.6.13 (@@innodb_version
также говорит 5.6.13), и в этой таблице есть row_format=dynamic
с примерно 400 КБ атрибутов больших двоичных объектов на строку. information_schema
также сообщает, что data_length
— это 58020446208, а avg_row_length
— это 255.
Вопросы
Так как же InnoDB вычисляет table_rows
для information_schema.tables
?
Возможно, связано: как он определяет data_length
и avg_row_length
? Включает ли это внешнее хранилище больших двоичных объектов (т. е. за пределами страницы B-дерева, но по-прежнему управляемое InnoDB)?
Если table_rows
используется в оптимизации SQL, должен ли я беспокоиться о том, что он отключен на 3 порядка?
Есть ли лучший способ оценить количество строк по атрибутам, доступным в information_schema
?