【问题标题】:Multiple large MySQL SELECT queries - better to run in parallel or in a queue?多个大型 MySQL SELECT 查询 - 更好地并行运行还是在队列中运行?
【发布时间】:2018-08-08 16:37:03
【问题描述】:

我已经查找了很多关于这个问题的答案,但找不到具体的答案 - 如果我错过了什么,请提前道歉!另外,我是一个 SQL 优化菜鸟。

我有一个分析仪表板,它根据用户的请求从大型数据库中提取数据。

用户加载的每个页面都会运行许多不同的查询来填充页面的不同部分(不同的图表、表格等)。其中一些页面可能需要相当长的时间才能加载,因为用户可能会请求几年的数据。

目前,页面的每个部分都将一个 SELECT 查询发送到 SQL 服务器,但由于页面有多个部分,这些查询最终会并行运行。

在队列中运行这些查询会更快吗 - 允许服务器一次处理一个查询?还是保持一切并行?

一次运行一个的额外好处是我们可以运行查询以首先填写页面的“首屏”部分...

希望一切都有意义,请放轻松:)

【问题讨论】:

    标签: mysql sql select query-optimization


    【解决方案1】:

    评论太长了。

    这个问题没有正确答案。在某种程度上,运行并行SELECT 查询(通常)会比一个运行查询更快。该点是 2 个查询还是 200 个查询取决于查询的性质、硬件配置、数据以及各种组件的速度。

    当您考虑可能涉及多少不同的用户以及数据是否正在更新时,情况会变得更加复杂。如果锁开始级联,您可能会通过并行查询和更新陷入非常糟糕的情况。当然,这也可能发生在多个同时用户身上。

    我的猜测是,您需要一种节流机制,可以一次运行 n 个查询,然后将其余查询放入队列中。

    【讨论】:

    • 我担心“这取决于”可能是答案。我最终进行了一系列测试,以查看每种情况下实际发生的情况。我最终选择了排队查询,因为总体时间要快一些,但更重要的是,在我的情况下,页面顶部的加载速度更快,而之前它只是根据首先回答的任何查询来填充。
    • @yyyyyyyyyyyyyyyyy 。 . .对于您的特定问题,我会非常小心“首选并行性”。您需要非常小心线程、内存和并发会话。
    【解决方案2】:

    我也说“视情况而定”,但我倾向于并行。

    • 并行度可能不应超过 CPU 内核的数量。
    • 我很少看到会占用所有 CPU 内核的系统 -- 除非它没有足够好的索引。也就是说,在提问之前修复索引。
    • 如果数据大于可以缓存的数据,可能排队会更快,因为您可能有一个阻塞点 -- I/O。
    • 如果表不断被更改,请关闭查询缓存。
    • 您的目标是尽早在页面上获得一些结果吗(可能是人机界面目标),在除一个 AJAX 被调用者(而非调用者)之外的所有对象中添加一小段延迟。
    • 如果可以同时计算多个页面,事情就会变得更加复杂。例如,您无法真正控制并行度。

    让我们看看查询。也许我们可以加快它们的速度来避免这个问题。

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多