【问题标题】:Large MyISAM table slow even for non-concurrent inserts/updates即使对于非并发插入/更新,大型 MyISAM 表也很慢
【发布时间】:2010-06-22 15:33:03
【问题描述】:

我有一个包含约 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 索引)- 加载一批任务进行处理

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

【问题讨论】:

    标签: sql mysql optimization myisam


    【解决方案1】:

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

    请通过thissf上的问题(虽然是为InoDB写的,但MyISAM也有类似的参数)

    之后你应该开始循环

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

    【讨论】:

      【解决方案2】:
      • EXPLAINUPDATE 对整个表的样本,以确保正在使用主键索引。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-09
        • 2020-11-13
        • 2020-11-13
        • 1970-01-01
        • 2013-09-17
        • 2015-01-22
        • 1970-01-01
        相关资源
        最近更新 更多