Я заметил, что итоги таблицы получаются при запуске:
SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database';
приводили к неверным итогам. Я также прочитал, что делает:
analyze table 'my_table';
будет обновлять информацию правильно. Но, похоже, дело не в этом. Итак, чтобы установить базовый уровень:
mysql> select count(*) from my_table;
+----------+
| count(*) |
+----------+
| 61782 |
+----------+
1 row in set (0.01 sec)
Далее, что показывает статистика:
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 58378 |
+--------------------+------------+
1 row in set (0.00 sec)
ясно, что не правильно, поэтому я выполняю анализ и проверяю снова:
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 56439 |
+--------------------+------------+
1 row in set (0.00 sec)
Хорошо, это изменилось, но это все еще неправильно. Я сделал это еще несколько раз:
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 58766 |
+--------------------+------------+
1 row in set (0.00 sec)
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 65749 |
+--------------------+------------+
1 row in set (0.00 sec)
mysql> analyze table my_table;
+------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------------------------+---------+----------+----------+
| my_database.my_table | analyze | status | OK |
+------------------------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> SELECT TABLE_NAME, TABLE_ROWS FROM 'information_schema'.'tables' WHERE 'table_schema' = 'my_database' AND TABLE_NAME = 'my_table';
+--------------------+------------+
| TABLE_NAME | TABLE_ROWS |
+--------------------+------------+
| my_table | 61870 |
+--------------------+------------+
1 row in set (0.00 sec)
и, как вы можете видеть, я никогда не получал одно и то же число, и ни один из них не является действительным числом строк. У меня такой вопрос: это индикатор того, что у меня проблема с моей базой данных (она делает это на всех таблицах) или это просто ошибка в MySQL?
Детали моей среды:
Версия сервера: 5.6.43 MySQL Community Server (GPL) Все таблицы INNODB, набор символов utf8
Для InnoDB статистика для table_rows является приблизительной, а не точной. Значения не обязательно должны быть точным количеством строк.
Нет, это не ошибка в MySQL. Статистика InnoDB не ошибается. Поведение задокументировано в Справочном руководстве MySQL.
Рекомендации:
https://dev.mysql.com/doc/refman/5.6/en/index-statistics.html
https://dev.mysql.com/doc/refman/5.6/en/innodb-persistent-stats.html