什么时候给定连接上的慢MySQL查询会影响其他连接?

时间:2012-07-01 19:10:40

标签: mysql performance

我认为我对此有基本的了解,但我希望有人能够提供更多详细信息,因为我有兴趣了解有关数据库性能的更多信息。

假设我有一个非常大的数据库,有数百万个条目,数据库支持许多连接。由于数据太多,对数据库进行简单查询的速度很慢。我试图准确理解给定连接上的查询何时开始对在其他连接上运行的查询的性能产生直接影响。

如果一个连接锁定某些元素,我理解这将阻止运行需要这些元素的其他连接的查询。例如:

SELECT FOR UPDATE

将锁定您选择的内容。

当你做一些简单的事情时会发生什么:

SELECT COUNT(*) FROM myTable

假设我们有一个十亿行的表,所以运行计数需要一些时间(在innodb上运行)。它会影响在其他连接上运行的查询吗?

如果使用SELECT和JOIN选择大量数据,例如:

,该怎么办?
SELECT * FROM myTable1 JOIN myTable2 ON myTable1.id = myTable2.id;

是否有连接锁定任何其他查询?

我发现很难知道哪些查询会对在其他连接上运行的查询的性能产生直接影响。

由于

3 个答案:

答案 0 :(得分:4)

有不同的角度:

  • 行锁定:如果您调整架构,这不应该发生,因此您应该忘记它
  • 真正的表演问题和瓶颈。在我们的例子中,附带影响。

关于第二点,问题主要分为3个方面:

  • 磁盘读取
  • 内存使用情况(缓冲区)
  • CPU使用率。

关于磁盘读取:您将检索的数据越多(以字节为单位),硬盘驱动器将越忙,并减慢使用它的任何其他活动。减小所选行的大小以避免磁盘开销。

关于内存使用情况:mysql管理内部缓冲区,在某些情况下可能会卡住。我不太了解它给你一个正确的答案,但我知道这绝对是你应该留意的事情。

关于cpu使用情况:基本上cpu会在忙碌时忙碌

  • 必须计算(加入,准备陈述,算术......)
  • 必须完成所有外围工作:例如,将字节从磁盘移动到内存。 优化查询以减少CPU开销。 (听起来很傻,但是,无论如何它总是成为问题......)

那么,现在何时知道什么时候有附带效应?通过剖析您的硬件...... 如何描述?

  • 绝对分析:使用SHOW INNODB STATUSSHOW PROFILE获取有关主要mysql harddrive,cpu和memory watch的有用信息。
  • 相对分析:使用您最喜欢的操作系统分析器。例如,在windows xp下,您可以使用优秀的perfmon.exe并注意mysql进程的PRIVATE BYTESVIRTUAL BYTES。我说亲戚,因为如果查询在您的计算机上耗费时间,那么它可能不在NASA系统上......

希望它有所帮助,问候。

答案 1 :(得分:3)

读取查询仅受其他查询的隔离级别的影响。他们自己不会阻止永远

隔离级别是指定的事务安全模式。如果使用锁定的另一个查询不允许脏读,则在其他查询完成写入或解锁之前,您的读取将一直保持。

MVCC是一种允许数据库在需要更新或删除时创建新版本数据的机制。这意味着当您开始读取当前版本的数据时,它的数据不会被未来的更新/删除所污染。

当您开始写入当前数据时,尽管数据当前正由另一个进程读取,您实际上是在其他地方编写新内容并将其标记为最新版本。这最终意味着没有阻止写入过程(至少不是因为阅读过程)。

答案 2 :(得分:2)

这是一个非常普遍的问题,因此难以给出准确的答案。

您可以将数据库视为共享资源池;特别是因为运行数据库的底层硬件具有物理限制。大多数情况下,您会看到类似于选择查询的原因会导致对其他查询的性能影响,因为它们都在竞争使用磁盘IO或RAM访问或CPU时间等底层物理资源,并且不足以绕过

因此,您看到的实际结果在很大程度上取决于数据库的物理硬件和配置设置。

例如,在您的选择示例中,变量可能是:查询需要的数据是否已在RAM中?它可以通过索引有效地查找行吗?如果它必须执行IO,有多少其他查询要求从磁盘读取数据?您使用二级索引并且必须进行多次读取吗?数据库正在预读以缓冲其他页面吗?查询是否导致顺序或随机io?是否有任何更新对数据进行锁定?物理硬件支持IO读取多少?

您必须回答当前正在执行的所有查询的所有问题,以了解它们是否会影响其他查询的效果。

这就是DBA存在的原因。繁忙的数据库是一个复杂的系统,它涉及许多不同操作的交互,所有这些操作都有数千个影响它们的可能变量。

所以你通常做的是优化你可以控制的东西以及你知道如何(硬件,mysql配置,模式和索引)然后开始测量系统,因为它运行以了解实际发生的事情。

因此,在您的情况下,我会说,专注于单独优化查询会更有帮助。它们执行得越快,它们可能使用的资源就越少,对其他资源的影响就越小。然后你学会分析系统。只看一件缓慢的事情并问“为什么这么慢?”然后解决它。这是优化过程。

但是,在第一种用SELECT ... FOR UPDATE编写的情况下,显式锁定可能并且将成为性能问题。小心那些。