【问题标题】:How simultaneous queries are handled in a MySQL database?如何在 MySQL 数据库中处理同时查询?
【发布时间】:2011-06-26 05:34:53
【问题描述】:

我正在使用 MySQL 数据库,我想知道我是否同时进行多个(500 多个)查询以从多个表中获取信息,这些查询是如何处理的?顺序还是并行?

【问题讨论】:

    标签: sql mysql performance


    【解决方案1】:

    查询总是在多个会话(即客户端连接)之间并行处理。单个连接上的所有查询一个接一个地运行。可以根据可用的服务器资源配置多个连接之间的并行度。

    通常,某些操作在各个查询会话(称为事务)之间受到保护。 InnoDB 后端支持这些,但 MyISAM 表不支持(但它支持称为原子操作的概念)。有各种不同的隔离级别,它们的不同之处在于哪些操作相互保护(以及一个并行事务中的操作如何影响另一个事务)以及它们对性能的影响。

    有关更多信息,请阅读general 中的事务和MySQL 中的实现。

    【讨论】:

    • 您好 Holger,您能否给我参考一下 MySQL 文档或更详细的文章中的“单个连接上的所有查询都一个接一个地运行”?除了在 SO 中,我在任何地方都找不到此信息。谢谢!
    • 嗯,这就是 MySQL(通常是所有 SQL 数据库)的工作方式:您基本上有一个请求-响应协议。您向服务器发送一个查询(例如SELECTUPDATE 查询),然后等待响应,该响应只有在您的查询完成后才会到达(对于游标、存储程序或自定义存储引擎,但仍保持基本原则)。只有在客户端发送的当前查询完成后,服务器才开始处理下一个查询。要并行运行多个客户端查询,您需要多个客户端连接。
    【解决方案2】:

    每个连接一次最多可以运行一个查询,并在单个线程中执行。服务器为每个查询打开一个线程。

    通常,希望查询不会相互阻塞。但是,根据引擎和查询,它们可能会。 MySQL 中有很多锁定,手册中对此进行了详细讨论。

    但是,如果它们不互相阻塞,它们仍然可以通过消耗资源来减慢彼此的速度。 IO 操作是这些减速的一个特殊来源。如果你的数据不适合内存,你真的应该将并行查询的数量限制在你的 IO 子系统可以处理的范围内,否则事情会变得非常糟糕。测量是关键。

    我通常会说,如果一次运行 500 个查询(而不是等待锁定),您可能无法从硬件中获得最佳价值(您有 500 个内核吗?有多少线程在等待 IO?)

    【讨论】:

      【解决方案3】:

      通常所有查询都会并行运行。

      但是……也有一些例外。根据您的事务隔离级别,可以在更新时锁定行。在此处阅读更多相关信息:http://dev.mysql.com/doc/refman/5.1/en/dynindex-isolevel.html

      【讨论】:

        猜你喜欢
        • 2020-09-30
        • 2013-10-05
        • 2012-10-24
        • 2023-03-04
        • 1970-01-01
        • 2016-09-19
        • 1970-01-01
        • 2015-07-12
        • 1970-01-01
        相关资源
        最近更新 更多