MySQL анализ таблицы приводит к странному поведению

0

Я заметил, что итоги таблицы получаются при запуске:

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

Теги:

1 ответ

1

Для 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню