gpt4 book ai didi

mysql - Google Cloud SQL 选择另一个表中不存在的行

转载 作者:行者123 更新时间:2023-11-29 06:53:50 25 4
gpt4 key购买 nike

我需要审核一些数据,但是我遇到了查询未返回的障碍。我在这里可以做些什么不同的事情,因为我真的不明白为什么这些查询会返回(从 mysql 工作台执行),即使是在让它们运行多个小时之后?我只是配置不足吗?

我有一个 n1 标准 4 谷歌云 sql 实例(4cpu,15GB 内存)。两个表如下。表一的 customer_id 上还存在一个索引。表 2 有 885481 行,表 1 有 1891653 行。

我尝试了三种查询变体来查找表 1 中的客户 ID,而表 2 中不存在这些客户 ID(表示为 account_group_id)。

我所期望的最高性能和实际返回:

Select customer_id
FROM Table1 as a
WHERE NOT EXISTS(
Select account_group_id
FROM Table2 as b WHERE b.account_group_id = a.customer_id
)

作为子查询:

Select customer_id
FROM Table1
WHERE customer_id NOT IN(
Select account_group_id
FROM Table2
)

作为左连接:

SELECT customer_id
FROM Table1 as a
LEFT OUTER JOIN Table2 as b ON a.customer_id = b.account_group_id
WHERE b.account_group_id IS NULL

编辑:因此,在发布我的问题之前进行一些修补并实际使用 EXPLAIN 后,出于某种原因,table2 子查询正在执行全表扫描。我已经在具有相同索引模式的测试/暂存环境中尝试了此查询,并且我在那里看到了索引查找。现在,我更加困惑了。 full table scan

即使我添加强制索引提示,查询优化器也拒绝使用主键。

这是查询计划在我的暂存环境中的样子:

enter image description here

对于为什么会发生这种情况有什么想法吗?

表1:

Table 1

表 2:

Table 2

最佳答案

有两件事:

  1. 确保表 2 在 account_group_id 上有一个 INDEX。否则,您将进行全表扫描,效率不高。

  2. SUB QUERY 选项是更好的选择,但不是 OUTER JOIN,因为它将两个表的行相乘,结果很可怕(而且似乎永远不会结束! ) 结果集。

如果索引不存在

 -- CREATING AN INDEX IN CASE
CREATE INDEX T2_agi ON Table2(account_group_id);

SELECT customer_id
FROM Table1 as a
WHERE customer_id NOT IN(
Select account_group_id
FROM Table2
);

关于mysql - Google Cloud SQL 选择另一个表中不存在的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46504830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com