【问题标题】:MySQL Bug? "SHOW TABLE STATUS" Reports Fluxuating Number of Rows During ImportMySQL错误? “SHOW TABLE STATUS”报告导入期间的行数波动
【发布时间】:2011-01-12 17:19:17
【问题描述】:

我正在将 410 万条记录导入离线系统,以便对我们数据库的一个子集进行一些分析。在运行导入时,我正在尝试使用以下方法检查其进度:

SHOW TABLE STATUS LIKE 'MailIssueElement'

奇怪的是...在不同的时间,我看到 Rows 的值更高和更低。我希望它只会上涨。以下是输出示例:

mysql> show table status like 'MailIssueElement' \G
*************************** 1. row ***************************
           Name: MailIssueElement
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 2818307
 Avg_row_length: 120
    Data_length: 338392232
Max_data_length: 281474976710655
   Index_length: 158029824
      Data_free: 0
 Auto_increment: 10248973
    Create_time: 2010-02-03 10:58:41
    Update_time: 2010-02-03 11:04:06
     Check_time: 2010-02-03 10:58:53
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.60 sec)

mysql> show table status like 'MailIssueElement' \G
*************************** 1. row ***************************
           Name: MailIssueElement
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 1870294
 Avg_row_length: 119
    Data_length: 223251912
Max_data_length: 281474976710655
   Index_length: 107688960
      Data_free: 0
 Auto_increment: 10248973
    Create_time: 2010-02-03 10:58:41
    Update_time: 2010-02-03 11:04:13
     Check_time: 2010-02-03 10:58:53
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.35 sec)

mysql> show table status like 'MailIssueElement' \G
*************************** 1. row ***************************
           Name: MailIssueElement
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 3074205
 Avg_row_length: 120
    Data_length: 369507112
Max_data_length: 281474976710655
   Index_length: 171537408
      Data_free: 0
 Auto_increment: 10248973
    Create_time: 2010-02-03 10:58:41
    Update_time: 2010-02-03 11:04:36
     Check_time: 2010-02-03 10:58:53
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.01 sec)

mysql> show table status like 'MailIssueElement' \G
*************************** 1. row ***************************
           Name: MailIssueElement
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 1870294
 Avg_row_length: 119
    Data_length: 223251912
Max_data_length: 281474976710655
   Index_length: 107688960
      Data_free: 0
 Auto_increment: 10248973
    Create_time: 2010-02-03 10:58:41
    Update_time: 2010-02-03 11:04:40
     Check_time: 2010-02-03 10:58:53
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

对这种行为有解释吗?有没有更好的方法来检查我的导入进度?

运行以下版本:服务器版本:5.0.32-Debian_7etch11-log Debian etch 发行版


编辑:

这里是 DDL。这是一个 MyISAM 表:

mysql> show create table MailIssueElement \G
*************************** 1. row ***************************
       Table: MailIssueElement
Create Table: CREATE TABLE `MailIssueElement` (
  `Id` int(11) NOT NULL auto_increment,
  `IssueId` int(11) NOT NULL default '0',
  `Date` datetime NOT NULL default '0000-00-00 00:00:00',
  `Direction` enum('inbound','outbound') NOT NULL default 'inbound',
  `ToAddr` varchar(255) NOT NULL default '',
  `FromAddr` varchar(255) NOT NULL default '',
  `CCAddrs` varchar(255) NOT NULL default '',
  `Subject` text NOT NULL,
  `ParentIssueElementId` int(11) default NULL,
  `ParentIssueElementType` enum('mail','phone') default 'mail',
  `AgentId` int(11) NOT NULL default '0',
  PRIMARY KEY  (`Id`),
  KEY `date_idx` (`Date`),
  KEY `IssueId` (`IssueId`),
  KEY `idx_agent_id` (`AgentId`)
) ENGINE=MyISAM AUTO_INCREMENT=15099881 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

提前致谢,

-aj

【问题讨论】:

    标签: mysql myisam dml


    【解决方案1】:

    关于行数

    某些存储引擎,例如 MyISAM,会存储准确的计数。对于其他存储引擎,例如 InnoDB,这个值是一个近似值,可能与实际值相差 40% 到 50%。

    取自MySQL :: MySQL 5.1 Reference Manual - SHOW TABLE STATUS Syntax

    【讨论】:

    • @Anthony - 查看我的编辑。它实际上是一个 MyISAM 表。这似乎与您提供的信息相矛盾,不是吗?还是我看错了?
    • 不用担心...您的回答之后;)感谢您的帮助。
    【解决方案2】:

    表必须是 InnoDB。

    来自显示状态文档

    行数。一些存储引擎,例如 MyISAM,存储确切的计数。对于其他存储引擎,如 InnoDB,此值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,请使用 SELECT COUNT(*) 获得准确的计数。

    【讨论】:

    • @Yada - 查看我的编辑。它实际上是一个 MyISAM 表。这似乎与您提供的信息相矛盾,不是吗?还是我看错了?
    【解决方案3】:

    好的,看起来是a bug reported and fixed。猜猜我最终需要从 Etch 升级到 Lenny 并获得那些更新的软件包...感谢所有尝试。

    【讨论】:

      【解决方案4】:

      如果您使用 InnoDB,行数似乎是通过将“Data_length”除以“Avg_row_length”(波动很大)来计算的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多