性能问题:将Mysql行格式从固定更改为动态

时间:2018-01-25 15:42:21

标签: mysql performance

我有一个包含12.8亿行的Mysql表。表的结构如下所示:

CREATE TABLE `wx_week_score` (
    `id` int(10) NOT NULL AUTO_INCREMENT,
    `r1` int(10) NOT NULL,
    `r2` char(10) NOT NULL,
    `r3` tinyint(4) NOT NULL DEFAULT '1',
    `r4` tinyint(4) unsigned NOT NULL,
    `r5` int(10) NOT NULL DEFAULT '0',
    `r6` int(10) NOT NULL DEFAULT '0',
    `r7` int(11) NOT NULL,
    PRIMARY KEY (`id`)
) 
ENGINE=MyISAM AUTO_INCREMENT=1281789 DEFAULT CHARSET=latin1 
ROW_FORMAT=FIXED;

最近我尝试将行格式更改为dynamic,但我遇到了一个问题:CPU的使用率非常高且几乎已满。

我的程序中有很多更新操作,我猜这些操作可能耗尽CPU资源。

有人可以给我解释吗?感谢。

1 个答案:

答案 0 :(得分:1)

如果您在转换为DYNAMIC期间弄乱了CPU,那又怎么样?这是一次性的任务。

如果SELECTs现在正在咀嚼CPU,请让我们看看它们。我只看到一个索引,所以我希望有很多全表扫描。如果你有足够的RAM来缓存表(超过40GB),那么这将解释高CPU,但不解释为什么你没有用FIXED看到它。

如果在转换为CREATE TABLE之前和之后确实是DYNAMIC,我怀疑没有的性能差异。如果您还将CHAR(10)更改为VARCHAR(10),我认为不会在性能上产生微不足道的差异。

你真的需要INT吗?如果将INT更改为TINYINT,则可节省大约4GB的磁盘空间。并使表格更易于缓存。

UPDATE命令可能会受到很大影响 - 在FIXEDDYNAMIC之间。

对于FIXED,行已更改"就位"。该行被提取,修改,然后存储。

对于DYNAMIC,如果生成的行不大于原始行,则会发生相同的情况。相反,如果它增长(由于VARCHARTEXT列中的字符串较长),则需要将溢出放在其他位置。这是通过将记录的各个部分链接起来,填充数据中的空白点来完成的。

所以,......既然你说过CPU,而不是I / O,我就推断了

  • 你有足够的桌面内存
  • 您确实切换到VARCHAR
  • 更新通常会延长单个10个字符的字符串。

如果我推断正确,那么

  • 您可能找到了一个(罕见)用例FIXED优于DYNAMIC
  • 由于将记录链接在一起,表格实际上可能比以前更大,即使没有INSERTs完成也会继续增长。

你真的应该切换到InnoDB和VARCHAR;我提到的几乎所有内容都与InnoDB无关。