InnoDB Small 更新很慢,性能问题
Posted
技术标签:
【中文标题】InnoDB Small 更新很慢,性能问题【英文标题】:InnoDB Small update very slow, performance issue 【发布时间】:2013-12-17 14:58:15 【问题描述】:我有一个更新脚本,每晚都会更新我的数据库。
这是一个小型数据库,大约 10k 项。 每个表的更新速度很快,但只有一个。在连接表上非常慢。
连接表是Item表和Type表之间的链接,如下所示:
Item.Code <-> JoinTable.RefCode (VARCHAR 30), JoinTable.IdType(int 11) <-> Type.id
引擎是 InnoDB。引用表上有两个外键,两列上有一个唯一键。此外,每列上的索引以允许外键。
我正在使用以下 SQL 查询来更新表:
INSERT INTO JoinTable (id, RefCode, IdType)
VALUES ( NULL, "AAA", 9584 )
ON DUPLICATE KEY UPDATE
id = LAST_INSERTED_ID(id),
refCode = values(refCode),
refType = values(refType)
因此,对于 15k 引用的 id,它运行大约 30 分钟的主要问题。
当我使用 MyISAM 引擎时,大约需要 2 秒。但没有更多的外键。
我了解 MyISAM 删除外键并且速度更快,但我认为对于这么小的数据库来说 30 分钟是很不正常的。
你能帮我提高性能吗?
【问题讨论】:
【参考方案1】:编辑 mysql 配置中的 InnoDB 设置并重新启动 MySQL 守护程序。它们都以“innodb_”开头,并且会解释它们的用途。
我更改了 innodb_buffer_pool_size 和 innodb_log_file_size。
【讨论】:
【参考方案2】:将插入更改为使用 IGNORE,并尝试不使用 VALUES()
INSERT IGNORE INTO JoinTable (id, RefCode, IdType)
VALUES ( NULL, "AAA", 9584 )
ON DUPLICATE KEY UPDATE
id = LAST_INSERTED_ID(id),
refCode = refCode,
refType = refType
也可能是您的 innodb 缓冲区太小。
【讨论】:
您好,感谢您的回复。 IGNORE 没有太大变化,它更快,但仍以分钟计。我还没有设置 wamp mysql Innodb 参数,然后我想我应该从那里开始以解决问题,但仍然,innodb 缓冲区大小为 1G,还没有变化。 如果你在没有函数 values() 的情况下运行它?顺便说一句,这有什么作用?以上是关于InnoDB Small 更新很慢,性能问题的主要内容,如果未能解决你的问题,请参考以下文章
什么可能导致 InnoDB 表的单个 UPDATE 性能非常缓慢?