【问题标题】:MySQL - I need to join two tables in-place and return the results (without creating a temporary table)MySQL - 我需要就地连接两个表并返回结果(不创建临时表)
【发布时间】:2020-04-05 18:53:54
【问题描述】:

这个值得解释一下。想象一下,我有两个事件,A 和 B,它们都按时间发生,例如:A A A B A B B A B A B B.... 这构成了一个 STREAM。

由于各种原因,我们将这些事件存储在 MySQL 中自己的表中,分别称为 TA 和 TB。两个表都有时间戳作为主键。 (我应该使用 Kafka,我知道...)

问题:我需要一个小客户端来查询从 start_time 到 end_time 的 MERGED 流的 HISTORY。我认为在客户端上进行联接没有意义(因为我必须查询 TA,然后查询 TB,然后进行联接,这会占用大量时间/内存/CPU)。 或者,服务器端连接虽然简单,但如果几个客户端都在略微重叠的时间请求略有不同的历史记录,则可能会出现问题......服务器上会有一堆临时表等。

有没有办法(而且它不必非常快)进行就地合并而不在服务器上创建临时表?例如,伪代码可能如下所示:

给定 TA 和 TB,具有 (itA = TA 的迭代器) 和 (itB = TB 的迭代器),并且两个迭代器都从 start_time 开始:

// An in-place merge sort
while (true)
  if (itA.time >= stop_time)
    if (itB.time >= stop_time)
      break
    output(itB++)
    continue
  if (itB.time >= stop_time)
    output(itA++)
    continue
  if (itA.time < itB.time)
    output(itA++)
    continue
  output(itB++)

该代码可能不是最有效的,但是您可以看到我在那里所做的...“输出”函数可能会以缓冲的方式将部分响应发送回客户端。有点像协程之类的。

请注意,如果解决方案是存储过程或在服务器上运行的一段代码(我们在服务器上使用 GoLang),我很好...我只是想避免在服务器就是一切。也许可以使用带有光标的东西?

哇!我希望这能说明我想要做什么,并提前感谢大家。

【问题讨论】:

    标签: mysql performance stored-procedures merge stream


    【解决方案1】:

    这会根据您的时间戳“合并”表格:

    ( SELECT ts, ... FROM TA )
    UNION ALL
    ( SELECT ts, ... FROM TB )
    ORDER BY ts
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      相关资源
      最近更新 更多