1

我们最近将表切换为专门使用 InnoDB(来自 MyISAM),这样我们就可以利用对数据库进行更新的能力,同时仍然允许SELECT查询发生(即不锁定每个表的整个表INSERT

我们有一个每周运行的周期,INSERTS大约有 1 亿行使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."

我们对当前每秒大约 2000 次插入/更新的更新性能相当满意。

但是,在此过程运行时,我们观察到常规查询需要很长时间。

例如,这需要大约 5 分钟来执行:

SELECT itemid FROM items WHERE itemid = 950768

(当INSERTs 没有发生时,上述查询需要几毫秒。)

有没有办法强制SELECT查询获得更高的优先级?否则,我可以在 MySQL 配置中更改任何可以提高性能的参数吗?

理想情况下,我们会在流量较低时执行这些更新,但是每个 SELECT 查询超过几秒钟的时间似乎会破坏能够同时更新和从数据库读取的目的。我正在寻找任何建议。

我们使用 Amazon 的 RDS 作为我们的 MySQL 服务器。

谢谢!

4

1 回答 1

2

我想你已经在将近一年后解决了这个问题:) 但我想我会插话。根据 MySQL 关于内部锁定的文档(而不是显式的、用户启动的锁定):

表更新的优先级高于表检索。因此,当一个锁被释放时,锁对写锁队列中的请求可用,然后对读锁队列中的请求可用。这可以确保即使表的 SELECT 活动很繁重,也不会“饿死”表的更新。但是,如果您对一个表有很多更新,则 SELECT 语句会一直等待,直到没有更多更新为止。

所以听起来你SELECT正在排队,直到你的插入/更新完成(或者至少有一个暂停。)关于改变优先级的信息可以在 MySQL 的表锁定问题页面上找到。

于 2014-04-17T23:33:18.787 回答