我一直试图从两个表中得到一个倒置的结果集,下面是一些技术细节:
初始表
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(第三)查询不应该进行表扫描,只是基于索引的查找:/
答案 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)
上的索引。