MySQL查询等待其他查询完成

时间:2016-04-25 08:37:06

标签: mysql database multithreading locking innodb

我们有30到40个不同的Python和PHP项目,每天在MySQL DB中更新,插入和选择超过100万行数据。

目前我们在表中使用InnoDB Engine。

问题:当几乎所有项目都在工作且在DB中处理大量查询时,我们在MySQL中达到了顶峰。主要查询对于完成ASAP(高优先级)非常重要,查询可以等待主查询完成(优先级较低)。 但是当他们进入MySQL并发时,它会导致主要查询等待优先级较低的查询完成。

问题:

  1. 在执行主查询之前是否有可能释放表中的所有锁(这样他们可以尽快完成)?或者如果有帮助就创建锁?

  2. 我们可以在自动启动执行主查询时暂停优先级较低的查询吗?

  3. 在查询帮助中可以使用HIGH_PRIORITY和LOW_PRIORITY吗?

  4. MySQL中是否有一些可以提供帮助的配置?

  5. 可以将表更改为MyISAM或其他数据库引擎吗?

  6. 让我知道你的想法和想法。

3 个答案:

答案 0 :(得分:1)

  1. 否。您可以尝试升级到MySQL 5.7,因为如果事务不会相互干扰,它允许在表中进行并行复制。
  2. 请参阅http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html有关LOW PRIORITY如何无效的信息。
  3. 见#2。
  4. 看看你如何锁定你的应用程序可能会更好 - 你是在锁定行,进行更改,快速解锁还是代码以悠闲的方式执行此操作?
  5. MyISAM锁定在表级别而非行级别,MyISAM不支持事务(这可能是您锁定记录的原因)。

答案 1 :(得分:0)

如果没有锁定查询,很难给出明确的答案。 如果你可以添加它们会更有用。 你可以研究几件事: 查找锁定语句,例如“select for update”,“insert on conflict update”等... - 很多时候最好在应用程序端捕获异常,然后让db做额外的工作。

读并发:可能是“读取已提交”对您来说足够了,并且它需要更少的锁。

如果您根据使用情况拥有复制专用实例(例如,仅关键服务器)

此致 Jony

答案 2 :(得分:0)

浏览您的高优先级查询,并确保它们写得很好并且具有/使用适当的索引。

使用与高优先级查询相同的表查找其他查询,并确保以相同的方式优化它们。

查询/索引更好时,将使用更少的CPU / RAM,并且行上发生的隐式锁更少,从而最大程度地提高了所有查询的速度。

在DBA站点上的查询和调优帮助,但是将需要更多信息。