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 更新很慢,性能问题的主要内容,如果未能解决你的问题,请参考以下文章

MySql InnoDB 可能的性能问题

InnoDB 瓶颈:放宽 ACID 以提高性能

什么可能导致 InnoDB 表的单个 UPDATE 性能非常缓慢?

使用 Hive 日期函数而不是硬编码日期字符串时,Hive 查询性能很慢?

InnoDB的4个特性

实体框架性能问题,saveChanges 很慢