mysqldump创建的行数超过主键的实际范围

enyaitl3  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(251)

我有一张大约29万行长的table。在备份之前,可能需要<200 mb。当我使用 mysqldump ,备份文件需要约800 mb,当我使用 mysql ,我现在看到它有约43万行,比原来的表多了很多(我正在通过heidisqlui检查)。但如果我对主键的总范围进行查询,它与旧表(~290000)相同。可能出了什么问题?
下面是有关特定表的创建代码。它只是一个变量列表(十进制类型)

CREATE TABLE `ciceroout` (
    `runID` INT(11) NOT NULL AUTO_INCREMENT,
    `IterationNum` DECIMAL(20,10) NULL DEFAULT NULL,
    `IterationCount` DECIMAL(20,10) NULL DEFAULT NULL,
    `RunningCounter` DECIMAL(20,10) NULL DEFAULT NULL,
    \* more 100 variables like this *\
    PRIMARY KEY (`runID`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=287705
;

编辑:这里是我实际使用的dump和restore命令。我们的数据库有六个表,我已经转储了一个表,所以我在这里转储其余的五个表。
转储表:

mysqldump -u root --single-transaction=true --verbose -p [dbname] --ignore-table=[dbname].images > \path\[backupname].sql

还原表(删除原始数据库并启动空数据库后):

mysql -u root -p [db name] < \path\[backupname].sql

这是我在HeidisqlUI上看到的

ozxc1zmp

ozxc1zmp1#

如果你想知道大导出文件:这是正常的。
数据以可读的格式(sql)存储,而表空间上的实际数据则以更有效的数据结构(b+树)存储
关于heidisql向您展示的表统计信息:
对于innodb来说,“行数”统计只是一个近似值。
结果 COUNT(*) 提供与原始行匹配的实际行数,对吗?
近似值会随着时间的推移而改变,并随着您开始处理数据而变得更好。
用于显示表状态的mysql手册页说明:
行数。一些存储引擎(如myisam)存储精确的计数。对于其他存储引擎,比如innodb,这个值是一个近似值,可能与实际值相差40%到50%。在这种情况下,请使用select count(*)获得准确的计数。

kqlmhetl

kqlmhetl2#

假设你在甩一个 INT ,这是数据库中的4字节数量。

Value = 1 -- dump contains ...,1,... -- effectively 2 bytes.
value = -1222333444 -- dump contains ...,-1222333444,... -- 12 bytes

通过这些例子,你可以看到 INT 可以占用一半到三倍的空间(其他数据类型会导致其他示例。)
“280k行”是精确的,在您之前不会更改 INSERT / DELETE 排。如前所述,“430k”是一个近似值。
在转储和加载之后,实际磁盘空间可能略有增加或减少。这是由许多因素造成的。
我们只能忍受这些不太重要的矛盾。 SHOW TABLE STATUS 是查看磁盘空间的另一种方法。
我认为“计数器”是整数。有什么理由在这上面保留10位小数位:

RunningCounter` DECIMAL(20,10)

将所有这些更改为 INT 将每列从10字节缩减到4字节。这将把磁盘利用率降低一半。

相关问题