簡體   English   中英

MySQL 8 MyISAM“ SHOW TABLE STATUS”行數

[英]mysql 8 MyISAM “SHOW TABLE STATUS” row count

我最近從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 |
+----------+

但是當我然后運行以下查詢時:

    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中進行了重大的, 不兼容的更改

以前,INFORMATION_SCHEMA查詢STATISTICS和TABLES表中的表統計信息是直接從存儲引擎檢索統計信息。 從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字典表中。 后續查詢將檢索緩存的統計信息,直到緩存的統計信息到期為止。

[...]

要隨時更新給定表的緩存值,請使用ANALYZE TABLE。

要始終直接從存儲引擎檢索最新統計信息並繞過緩存的值,請將information_schema_stats_expiry設置為0。

這與您的行為一致。

您可以將information_schema_stats_expiry全局設置為0,也可以在需要准確統計信息時按會話設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM