即使对于非并发插入/更新,大型MyISAM表也会变慢

时间:2010-06-22 15:33:04

标签: sql mysql optimization myisam

我有一张约50,000,000条记录的MyISAM表(网页抓取工具):

CREATE TABLE `tasks2` (
    `id` int(11) NOT NULL auto_increment,
    `url` varchar(760) character set latin1 NOT NULL,
    `state` varchar(10) collate utf8_bin default NULL,
    `links_depth` int(11) NOT NULL,
    `sites_depth` int(11) NOT NULL,
    `error_text` text character set latin1,
    `parent` int(11) default NULL,
    `seed` int(11) NOT NULL,
    `random` int(11) NOT NULL default '0',
    PRIMARY KEY  (`id`),
    UNIQUE KEY `URL_UNIQUE` (`url`),
        KEY `next_random_task` (`state`,`random`)
) ENGINE=MyISAM AUTO_INCREMENT=61211954 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

每隔几秒钟就会发生一次以下操作(但从不同时):

  1. INSERT ... VALUES(500行) - 插入新任务
  2. UPDATE ... WHERE id IN(最多10个ID) - 更新批量任务的状态
  3. SELECT ... WHERE(通过next_random_task索引) - 加载一批要处理的任务
  4. 我的问题是插入和更新非常慢 - 运行大约几十秒,有时超过一分钟。但是选择很快。为什么会发生这种情况以及如何提高绩效?

2 个答案:

答案 0 :(得分:2)

在常规硬件上约50M是一个不错的数字。

请在sf上查看this问题(即使它是为InoDB编写的,MyISAM也有类似的参数)

之后你应该开始

的循环
  • 识别(记录)慢查询以了解您的模式(或确认您的假设)
  • 调整my.cnf或添加/删除索引(取决于模式)
  • 衡量改进

答案 1 :(得分:1)

  • EXPLAIN针对整个表的示例UPDATE,以确保使用主键索引。

  • 考虑将state更改为TINYINTENUM以使其索引更小。 (ENUM实际上可能不会这样做。)

  • 您需要url上的唯一键吗?这会减慢插入速度。