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

时间:2017-09-30 16:38:32

标签: mysql sql google-cloud-sql

我需要审核一些数据,但是我遇到了一个没有返回查询的障碍。我可以在这里做些什么不同,因为我真的不明白这些查询是否正在返回(从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扫描。我已经在我的测试/登台环境中使用相同的索引模式尝试了这个查询,我看到索引在那里寻找。现在,我更加困惑。 full table scan

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

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

enter image description here

有关为何发生这种情况的任何想法?

表1:

Table 1

表2:

Table 2

2 个答案:

答案 0 :(得分:2)

两件事:

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

  2. SUB QUERY选项是更好的选择,但不是OUTER JOIN,因为它将两个表行相乘,得到一个可怕的(看似永无止境!)结果集。

  3. 如果索引不存在

     -- 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
)