1

我有一个带有 ~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 (by next_random_task index) - 加载一批任务进行处理

我的问题是插入和更新非常慢 - 运行几十秒,有时超过一分钟。不过,选择很快。为什么会发生这种情况以及如何提高性能?

4

2 回答 2

2

普通硬件上约 50M 是一个不错的数字。

请在 sf 上通过这个问题(即使它是为 InoDB 编写的,MyISAM 也有类似的参数)

之后,您应该开始循环

  • 识别(记录)慢查询以了解您的模式(或确认您的假设)
  • 调整 my.cnf 或添加/删除索引(取决于模式)
  • 衡量改进
于 2010-06-22T15:57:01.217 回答
1
  • EXPLAIN针对整个表的样本UPDATE,以确保正在使用主键索引。

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

  • 你需要唯一的钥匙url吗?这将减慢插入速度。

于 2010-06-22T15:55:55.730 回答