MySQL卡在“上”;“分类修理”;(启用关键点)

MySQL卡在“上”;“分类修理”;(启用关键点),mysql,Mysql,我有一个更新localhost的脚本,然后将更新的结果转储到remotehost: mysqldump --skip-tz-utc --no-create-info --insert-ignore --host=localhost -u u -ppass db table --where=\"timeStamp > FROM_UNIXTIME( $time )\" | mysql -h remote -u u -ppass db 有20条记录,对localhost的更

我有一个更新localhost的脚本,然后将更新的结果转储到remotehost:

mysqldump --skip-tz-utc --no-create-info --insert-ignore --host=localhost -u u -ppass db table --where=\"timeStamp > FROM_UNIXTIME( $time )\" | mysql -h remote -u u -ppass db
有20条记录,对localhost的更新非常快(几秒钟),但对remotehost的转储要花费4分钟以上……当我查看mysql workbench时,它说远程主机的状态是“通过排序修复”,信息列是“/*!40000 ALTER TABLE‘TABLE’ENABLE KEYS*/”

这条消息是什么意思(为什么要花这么长时间才能转储到记录如此之少的remotehost)


谢谢

mysqldump
正在禁用索引、插入记录并重新启用索引。这意味着它会影响整个表,包括基于时间的更多记录


--skip disable key
添加到
mysqldump
的参数中,这应该会停止。

在重新加载期间,
mysqldump
命令将对表执行三项操作:

  • 禁用按键
  • 多个插入
  • 启用按键
    禁用键时,实际上会禁用非唯一索引

    主键和唯一键会立即加载

    一旦启动启用键,所有非唯一索引都将使用“排序修复”生成

    如果您绕过
    禁用键
    启用键
    ,情况会变得更糟,因为主键、唯一键和非唯一键都是逐行构建的,这在MySQL内部是一个更混乱的操作

    由于添加的数据太少,所以按照“独裁”的建议执行
    --跳过禁用键
    ,既明智又简洁


    顺便说一句,这只适用于MyISAM表。InnoDB忽略
    禁用键
    启用键

    取决于您是否更改触发器并需要备份它们。我从你的使用模式猜测跳过触发器是有意义的,但你必须亲自查看它的详细信息才能确定。我想你更让我困惑了……你说如果我绕过禁用键,我会让事情变得更糟,但请在1段后告诉我这样做。我已经实现了专制的解决方案……这就是我应该做的吗?如果将大量行加载到一个包含许多索引的空表中,情况会更糟。通过先禁用键,然后在最后启用键,可以优化构建索引的过程,特别是在插入空表的大量行上构建索引的过程(在末尾一次完成,并且没有其他数据需要担心)。但是,假设您将一行插入到1亿行中,动态地为该行重新平衡索引比删除它并从头开始创建索引更有效。。。我想反正就是这样;-)