mysql - MySQL - 我需要就地连接两个表并返回结果(不创建临时表)
问题描述
这个值得解释一下。想象一下,我有两个事件,A 和 B,它们都发生在时间上,例如:AAABABBABAB 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),我很好...我只是想避免在服务器上创建大型临时表是全部。也许可以使用带有光标的东西?
哇!我希望这能说明我想要做什么,并提前感谢大家。
解决方案
这会根据您的时间戳“合并”表:
( SELECT ts, ... FROM TA )
UNION ALL
( SELECT ts, ... FROM TB )
ORDER BY ts
推荐阅读
- python - get_access_token() 接受 0 个位置参数,但给出了 1 个
- windows - Matlab,Windows 兼容的 Docker 容器无法运行 Azure Devops CI/CD 作业的 Matlab 作业步骤
- python - 你可以在返回值后继续遍历列表吗?
- python - Spyder 无法启动:pyzmq
- vb.net - 彩票软件有问题
- c++ - 正则表达式提升库 regex_search 匹配错误
- c# - 如何实现令牌系统以限制 C# 中处理器/IO 繁重的多线程任务的并发性?
- php - 使用 PHP cURL 发布 JSON 数据返回无效的内容类型错误
- javascript - 将 HTML 按钮转换为 CSS 开关以使用 Javascript
- mysql - 如果一行已经有一定数量的插入,则 SQL 限制在表中插入