首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql 8 MyISAM“显示表状态”行计数

问mysql 8 MyISAM“显示表状态”行计数
EN

Stack Overflow用户
提问于 2019-05-30 21:47:55
回答 1查看 654关注 0票数 1

最近,我从mySQL 5.6.34 -> 8.0.16 (在macOS 10.14.5上)进行了升级,并且注意到了非常奇怪的行为,即从“显示表状态”返回的行计数以及"information_schema“表中的行计数。考虑一下这个简单的模式:

代码语言:javascript
复制
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');

然后,当我运行以下查询时,会看到预期的输出:

代码语言:javascript
复制
SELECT * FROM test;
+----+-------+
| id | name  |
+----+-------+
|  1 | one   |
|  2 | two   |
|  3 | three |
|  4 | four  |
|  5 | five  |
+----+-------+

同样,当我运行以下查询时,会看到预期的输出:

代码语言:javascript
复制
SELECT COUNT(*) FROM test;
+----------+
| COUNT(*) |
+----------+
|        5 |
+----------+

但是,当我运行以下查询时:

代码语言:javascript
复制
    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行)。同样,我在运行时也看到了相同的结果:

代码语言:javascript
复制
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'test';
    +------------+------------+
    | TABLE_NAME | TABLE_ROWS |
    +------------+------------+
    | test       |          0 |
    +------------+------------+

没有排?如果我向表中添加/删除行,计数不会更改。只有在我跑完之后:

代码语言:javascript
复制
ANALYZE TABLE `test`

...do --我认为所有行都是正确的。我只在mySQL 8上看到了这一点。在mySQL 5上一切都如预期的那样工作。我知道使用InnoDB表进行准确的行计数存在问题,但是这些都是MyISAM表,它们应该总是显示正确的行计数。任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 06:53:22

随着MySQL 8中不兼容的更改的引入,信息模式表经历了重大的变化。

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

缓存由系统变量information_schema_stats_expiry控制。

一些INFORMATION_SCHEMA表包含提供表统计信息的列: ..。TABLES.TABLE_ROWS ... 这些列表示动态表元数据;也就是说,随着表内容的变化而变化的信息。 默认情况下,在查询列时,MySQL从mysql.index_stats和mysql.table_stats字典表中检索这些列的缓存值,这比直接从存储引擎检索统计信息更有效。如果缓存的统计信息不可用或已过期,MySQL将从存储引擎检索最新的统计信息,并将它们缓存在mysql.index_stats和mysql.table_stats字典表中。随后的查询将检索缓存的统计信息,直到缓存的统计信息过期为止。 ..。 若要随时更新给定表的缓存值,请使用分析表。 若要始终直接从存储引擎检索最新统计信息并绕过缓存值,请将information_schema_stats_expiry设置为0。

这和你的行为是一致的。

您可以将information_schema_stats_expiry全局设置为0,或者在需要准确统计数据时将每个会话设置为0。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56386045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档