我有一个包含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资源。
有人可以给我解释吗?感谢。
答案 0 :(得分:1)
如果您在转换为DYNAMIC
期间弄乱了CPU,那又怎么样?这是一次性的任务。
如果SELECTs
现在正在咀嚼CPU,请让我们看看它们。我只看到一个索引,所以我希望有很多全表扫描。如果你有足够的RAM来缓存表(超过40GB),那么这将解释高CPU,但不解释为什么你没有用FIXED
看到它。
如果在转换为CREATE TABLE
之前和之后确实是DYNAMIC
,我怀疑没有的性能差异。如果您还将CHAR(10)
更改为VARCHAR(10)
,我认为不会在性能上产生微不足道的差异。
你真的需要INT
吗?如果将INT
更改为TINYINT
,则可节省大约4GB的磁盘空间。并使表格更易于缓存。
UPDATE
命令可能会受到很大影响 - 在FIXED
和DYNAMIC
之间。
对于FIXED
,行已更改"就位"。该行被提取,修改,然后存储。
对于DYNAMIC
,如果生成的行不大于原始行,则会发生相同的情况。相反,如果它增长(由于VARCHAR
或TEXT
列中的字符串较长),则需要将溢出放在其他位置。这是通过将记录的各个部分链接起来,填充数据中的空白点来完成的。
所以,......既然你说过CPU,而不是I / O,我就推断了
VARCHAR
如果我推断正确,那么
FIXED
优于DYNAMIC
。INSERTs
完成也会继续增长。你真的应该切换到InnoDB和VARCHAR
;我提到的几乎所有内容都与InnoDB无关。