我有一个更新脚本,每天晚上更新我的数据库。
这是一个小数据库~10k个项目。除一个表外,每个表的更新速度都很快。在联接表上非常慢。
连接表是项目表和类型表之间的链接,如下所示:
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)
因此,对于 30k 引用的 id,它运行了大约 15 分钟的主要问题。
当我使用MyISAM引擎时,它大约是2秒,但没有更多的外键。
我知道MyISAM删除外键并且速度更快,但我认为对于如此小的数据库来说,30分钟远非正常。
你能帮我提高性能吗?
编辑 MySQL 配置中的 InnoDB 设置并重新启动 MySQL 守护程序。 它们都以"innodb_"开头,并将解释其目的。
我更改了innodb_buffer_pool_size和innodb_log_file_size。
将插入更改为使用 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 缓冲区大小太小。