使用简单的NOT IN(SUBQUERY)时SQL查询速度极慢

时间:2017-11-01 00:51:58

标签: mysql sql amazon-rds

我一直试图从两个表中得到一个倒置的结果集,下面是一些技术细节:

初始表

CREATE TABLE `initial_table` (`id` varchar(255) NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`))

另一张表

CREATE TABLE `another_table` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`row_id` varchar(255) NOT NULL DEFAULT '',PRIMARY KEY (`id`),KEY `row_id` (`row_id`))

尝试声明的解释

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | PRIMARY | initial_table | index | NULL | PRIMARY | 767 | NULL | 2965400 | Using where; | Using index
2 | DEPENDENT SUBQUERY | another_table | index | NULL | row_id | 257 | NULL | 770452 | Using where; | Using index

在another_table中是initial_table的子集。初始表大约有3,000,000行,而another_table是600,000行。我想从another_table得到结果的倒数,基本上是initial_table中的2,400,000行,而这些行在another_table中不存在。

我尝试了以下查询:

INSERT INTO results_table SELECT a.id FROM initial_table AS a LEFT OUTER JOIN another_table AS z ON a.id = z.row_id WHERE z.row_id IS NULL
INSERT INTO results_table SELECT a.id FROM initial_table as a WHERE NOT IN (SELECT z.row_id FROM another_table AS z)
INSERT INTO results_table SELECT a.id FROM initial_table AS a WHERE NOT EXISTS (SELECT z.row_id FROM another_table AS z WHERE a.id = z.row_id)
INSERT INTO results_table SELECT a.id FROM initial_table AS a WHERE NOT EXISTS (SELECT 1 FROM another_table AS z WHERE a.id = z.row_id)

上述所有内容在执行后4小时内已经产生(最多)34,000行,AWS表示它选择的速度约为1.89 SELECT /秒

我可以在这里执行某种形式的优化吗?遗憾的是,initial_table主键是包含UUID而不是基于整数的主键的varchar,但至少所有相关列都已编制索引。不知道为什么它如此怪异,因为至少在理论上,WHERE NOT EXISTS(第三)查询不应该进行表扫描,只是基于索引的查找:/

1 个答案:

答案 0 :(得分:0)

我会选择:

INSERT INTO results_table (id)
    SELECT a.id
    FROM initial_table a
    WHERE NOT EXISTS (SELECT 1 FROM another_table z WHERE a.id = z.row_id);

对于此查询,您需要another_table(row_id)上的索引。