我需要审核一些数据,但是我遇到了一个没有返回查询的障碍。我可以在这里做些什么不同,因为我真的不明白这些查询是否正在返回(从mysql工作台执行),即使让它们运行了多个小时?我刚刚配置好吗?
我有一个n1标准的4个google云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扫描。我已经在我的测试/登台环境中使用相同的索引模式尝试了这个查询,我看到索引在那里寻找。现在,我更加困惑。
即使我添加了强制索引提示,查询优化器也拒绝使用主键。
这是查询计划在我的暂存环境中的样子:
有关为何发生这种情况的任何想法?
表1:
表2:
答案 0 :(得分:2)
两件事:
确保表2在account_group_id
上有一个INDEX。否则,您正在进行全表扫描,效率不高。
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
);
答案 1 :(得分:0)
经过多次修补之后,我完全重写了这个查询,让愚蠢的优化器使用我想要的索引......必须与表的大小有关:
SELECT a.customer_id
FROM Table1 as a
WHERE a.customer_id NOT IN (
SELECT b.customer_id
FROM Table1 as b
JOIN (select account_group_id from Table2) as x on x.account_group_id = b.customer_id
)