代码之家  ›  专栏  ›  技术社区  ›  AJ.

MySQL错误?“显示表状态”报告导入期间的行数变化

  •  2
  • AJ.  · 技术社区  · 15 年前

    我将把4.1分钟的记录导入离线系统,以便对数据库的一个子集进行分析。在运行导入时,我尝试使用以下命令检查导入进度:

    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 etch11-log debian etch distribution


    编辑:

    这是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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Anthony Forloney    15 年前

    关于行数

    一些存储引擎(如myisam)存储精确的计数。对于其他存储引擎(如InnoDB),该值是近似值,可能与实际值相差40%到50%。

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

        2
  •  2
  •   Yada    15 年前

    表必须是innodb。

    从显示状态文档

    行数。一些存储引擎(如myisam)存储精确的计数。对于其他存储引擎, 如innodb,该值是一个近似值,可能与实际值相差40%到50%。 . 在这种情况下,使用select count(*)获得准确的计数。

        3
  •  1
  •   AJ.    15 年前

    好吧,看起来像是 a bug reported and fixed . 我想我最终需要从Etch升级到Lenny并获得那些更新的软件包…谢谢大家的努力。

        4
  •  0
  •   tinnet    14 年前

    在使用InnoDB的情况下,行似乎是通过将“数据\长度”除以“平均\行\长度”(波动很大)来计算的。