【问题标题】:How to improve InnoDB's SELECT performance while INSERTing如何在 INSERTing 时提高 InnoDB 的 SELECT 性能
【发布时间】:2013-06-30 15:57:52
【问题描述】:

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

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

我们对目前每秒大约 2000 次插入/更新的更新性能感到非常满意。

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

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

SELECT itemid FROM items WHERE itemid = 950768

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

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

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

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

谢谢!

【问题讨论】:

  • 你的缓冲池有多大,你有多少内存?
  • 感谢您的评论。我现在不确定,但我认为我解决了这个问题。我发现只要我查询主键或索引列,结果就会立即返回。我唯一真正的用例是查询索引字段。由于我很好奇并想了解更多信息,我将保留这个问题,但我认为我的直接关注已经解决。

标签: mysql innodb amazon-rds


【解决方案1】:

我想你已经在将近一年后解决了这个问题 :) 但我想我会插话的。根据 MySQL 在internal locking 上的文档(与显式的、用户启动的锁定相反):

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

所以听起来您的SELECT 正在排队,直到您的插入/更新完成(或至少有一个暂停。)有关更改该优先级的信息可以在 MySQL 的Table Locking Issues 页面上找到。

【讨论】:

    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 2016-04-19
    • 2021-08-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多