mysql 8 MyISAM“;“显示表格状态”;行数

mysql 8 MyISAM“;“显示表格状态”;行数,mysql,Mysql,我最近从mySQL 5.6.34->8.0.16(在macOS 10.14.5上)升级,我注意到从“SHOW TABLE STATUS”返回的行数以及“information_schema”表中的行数出现了非常奇怪的行为。考虑这个简单的模式: CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci N

我最近从mySQL 5.6.34->8.0.16(在macOS 10.14.5上)升级,我注意到从“SHOW TABLE STATUS”返回的行数以及“information_schema”表中的行数出现了非常奇怪的行为。考虑这个简单的模式:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `test` (`id`, `name`) VALUES
(1, 'one'),
(2, 'two'),
(3, 'three'),
(4, 'four'),
(5, 'five');
然后运行以下查询时,我会看到预期的输出:

SELECT * FROM test;
+----+-------+
| id | name  |
+----+-------+
|  1 | one   |
|  2 | two   |
|  3 | three |
|  4 | four  |
|  5 | five  |
+----+-------+
SELECT COUNT(*) FROM test;
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+
同样,当我运行以下查询时,我会看到预期的输出:

SELECT * FROM test;
+----+-------+
| id | name  |
+----+-------+
|  1 | one   |
|  2 | two   |
|  3 | three |
|  4 | four  |
|  5 | five  |
+----+-------+
SELECT COUNT(*) FROM test;
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+
但是,当我运行以下查询时:

    SHOW TABLE STATUS \G
*************************** 1. row ***************************
           Name: test
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: 1
    Create_time: 2019-05-30 13:56:46
    Update_time: 2019-05-30 16:02:24
     Check_time: NULL
      Collation: utf8_unicode_ci
       Checksum: NULL
 Create_options: 
        Comment: 
似乎没有行(即使有5行)。同样,我在跑步时也看到了相同的结果:

SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'test';
    +------------+------------+
    | TABLE_NAME | TABLE_ROWS |
    +------------+------------+
    | test       |          0 |
    +------------+------------+
没有争吵?如果向表中添加/删除行,则计数不会更改。只有在我跑步之后:

ANALYZE TABLE `test`

…我是否认为所有行计数都是正确的。我只是在mySQL 8上看到这个。在mySQL 5上,一切都按预期进行。我知道使用InnoDB表进行精确的行计数存在问题,但这些都是MyISAM表,它们应该始终显示正确的行计数。感谢您的帮助。谢谢。

信息架构表非常重要,引入了:

以前,信息模式查询统计信息和表中的表统计信息,直接从存储引擎检索统计信息。从MySQL 8.0开始,默认情况下使用缓存表统计信息

缓存由系统变量控制:

某些信息\u架构表包含提供表统计信息的列:

[…]TABLES.TABLE_行[…]

这些列表示动态表元数据;也就是说,随着表内容的变化而变化的信息

默认情况下,当查询这些列时,MySQL会从MySQL.index_stats和MySQL.table_stats字典表中检索这些列的缓存值,这比直接从存储引擎检索统计数据更有效。如果缓存的统计数据不可用或已过期,MySQL将从存储引擎检索最新的统计数据,并将其缓存在MySQL.index_stats和MySQL.table_stats字典表中。后续查询检索缓存的统计信息,直到缓存的统计信息过期

[……]

要随时更新给定表的缓存值,请使用ANALYZE table

要始终直接从存储引擎检索最新的统计信息并绕过缓存值,请将information_schema_stats_expiry设置为0

这与你的行为一致

您可以将
information\u schema\u stats\u expiry
全局设置为0,或在需要精确统计信息时将每个会话设置为0