MySQL-我需要就地连接两个表并返回结果(不创建临时表)

问题描述 投票:0回答:1

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

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

问题:我需要一个小的客户端才能查询从start_time到end_time的MERGED流的历史记录。我认为在客户端上进行联接没有任何意义(因为我必须先查询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个回答
0
投票

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

( SELECT ts, ... FROM TA )
UNION ALL
( SELECT ts, ... FROM TB )
ORDER BY ts
© www.soinside.com 2019 - 2024. All rights reserved.