Sql 连接/查询大型表

Sql 连接/查询大型表,sql,Sql,[Aim] 我们想查看表A中是否已经存在一个事件,如果已经存在,则查找多少次。然后,应将此count()连接到一个包含所有表B事件和表a事件计数的查询中 [Context] “表A”有约400万行,结构如下: |唯一的| id |日期| “表B”有约100万行,具有以下结构:|unique|id | date | cost |“unique|id”是我们可以用来进行“连接”的系统范围的id [预期结果] 具有如下输出: b.unique_id | b.date | 'count of A ev

[Aim]
我们想查看表A中是否已经存在一个事件,如果已经存在,则查找多少次。然后,应将此count()连接到一个包含所有表B事件和表a事件计数的查询中

[Context]
“表A”有约400万行,结构如下:
|唯一的| id |日期|

“表B”有约100万行,具有以下结构:
|unique|id | date | cost |

“unique|id”是我们可以用来进行“连接”的系统范围的id

[预期结果]
具有如下输出:

b.unique_id | b.date | 'count of A events, if any' | b.cost
[问题]
-如何构造此查询以使其尽可能快地运行?风景?询问?还有别的吗


谢谢

您似乎想要的查询是:

select b.uniqueid, count(a.uniqueid) as num_a, b.cost
from b left join
     a
     on b.uniqueid = a.uniqueid
group by b.uniqueid, b.cost;
优化查询在很大程度上取决于数据库。对于这个查询,
a(uniqueid)
上的索引肯定会有所帮助。而且可能是
b(uniqueid,b.cost)
上的一个

在某些情况下,编写以下查询可能会更快:

select b.uniqueid,
       (select count(*) from a where b.uniqueid = a.uniqueid) as num_a,
       b.cost
from b;

在这种情况下,实际上只需要
a(uniqueid)
上的索引。

如果这个表的连接是您的问题,也许您可以创建一个物化视图。
还有一件事,你需要问问自己,你真的需要这个表中的所有数据实时吗?也许你可以压缩这个表格的一部分,使其更轻。

你需要使用索引!!!。。这将有助于:)还有,您正在使用哪些数据库管理系统?博士后?神谕一般来说,调优的第一步是查看执行计划。听起来您正在尝试执行几种不同的操作(确定是否存在记录、获取计数、获取相关记录……)。你能给出一个输出应该是什么样的例子吗?如果ID是唯一的,计数不总是1吗?谢谢你的回复。DBMS=MySQL 5.6输出示例:unique|u id | count 123 | 10 222 | 2 id本身在数据库中是唯一的。但在表a和表b中,它们都记录了事件。换句话说,unique_id=1可以在任一表中有多个事件