我们最近将表格切换为使用InnoDB(来自MyISAM),因此我们可以利用对数据库进行更新的功能,同时仍允许SELECT
查询发生(即不锁定整个表格每个INSERT
)
我们有一个周期,每周运行INSERTS
大约1亿行,使用"INSERT INTO ... ON DUPLICATE KEY UPDATE ..."
我们对目前每秒大约2000个插入/更新的更新性能非常满意。
但是,在此过程运行时,我们发现常规查询需要很长时间。
例如,这需要大约5分钟才能执行:
SELECT itemid FROM items WHERE itemid = 950768
(当INSERT
未发生时,上述查询需要几毫秒。)
有没有办法强制SELECT
查询获得更高的优先级?否则,我是否可以在MySQL配置中更改任何可以提高性能的参数?
理想情况下,当流量较低时,我们会执行这些更新,但每个SELECT查询的任何时间超过几秒似乎都无法同时更新和读取数据库。我正在寻找任何建议。
我们正在使用亚马逊的RDS作为我们的MySQL服务器。
谢谢!
答案 0 :(得分:2)
我想你已经在将近一年后解决了这个问题:)但是我想我会插话。根据MySQL关于internal locking的文档(与显式的,用户启动的锁定相反):
表更新的优先级高于表检索。因此,当释放锁定时,锁定对写入锁定队列中的请求可用,然后对读取锁定队列中的请求可用。这可确保即使表中存在大量SELECT活动,对表的更新也不会“缺乏”。但是,如果对表有很多更新,SELECT语句将一直等到没有更新。
所以听起来你的SELECT
排队等待你的插入/更新完成(或者至少暂停了。)有关改变优先级的信息可以在MySQL' s上找到{3}}页面。