因此,我在数据库中的所有表上启动了带有修复选项的 myisamchk 实用程序。
较小的表(最大 1GB)很快就得到修复,几乎是几秒钟。但是,我最大的表 (9GB) 需要很长时间才能修复 (20mb/min)。我的服务器因此而宕机。
我检查了“iotop -ao”,这就是我得到的:
这里发生了什么?在此屏幕截图中,300 KB/S 的读取速度非常高,我的目标是捕捉超快的写入速度。有时读取速度会达到 5-10 MB/s,但其余时间在 0-50KB/s 范围内。
该表只有几列,2 个索引 (1) Long,(2) Varchar(72)。Mysql 5.5.56,CentOS 6。正在分类修复。
任何可能涉及的人;
这种磁盘读取速度慢的问题在于数据的碎片化。同一张表的后续修复会产生非常高的磁盘读取 i/o,表明顺序访问与随机访问相反。
该表有大量删除行,新插入的记录必须以随机方式读取,导致读取速度慢。同样,修复表后,顺序存储的记录和相同的修复操作给出了非常快的结果。我想这是在 MyISAM 上使用 InnoDB 的另一个原因。
谢谢,迈克尔。
“修复”涉及重建索引。什么指标,有多少?
重建 MyISAM 索引可以通过以下两种方式之一完成:
“按排序”似乎通常要快得多,尤其是当索引大于
key_buffer_size
.我建议您尝试
key_buffer_size
并max...size
查看哪种方式最有效。请报告您的发现。(抱歉,我没有直接的答案;这个问题困扰了我 18 年的大部分时间。我不再想太多,因为 MyISAM 正在消失,每个人都在转向 InnoDB。 )