我有可能会存储整数数十万的表:从一组值中,我如何找到未存储在表格列中的值?
desc id_key_table;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| id_key | int(16) | NO | PRI | NULL | |
+----------------+--------------+------+-----+---------+-------+
从一个计划,我有一个大的整数集。我想看看哪些整数不在上面的id_key列中。
到目前为止,我想出了以下方法:
1)遍历每个整数,执行:
select count(*) count from id_key_table where id_key = :id_key
当计数为0的id_key从表中缺少。
这似乎是一个可怕的,可怕的方式来做到这一点。
2)创建一个临时表,将每个值插入到临时表中,然后对这两个表执行JOIN。
create temporary table id_key_table_temp (id_key int(16) primary key);
insert into id_key_table_temp values (1),(2),(3),...,(500),(501);
select temp.id_key
from id_key_table_temp temp left join id_key_table as main
on temp.id_key = main.id_key
where main.killID is null;
drop table id_key_table_temp;
这似乎是最好的方法,但是,我敢肯定还有更好的方法,我还没有想到。我宁愿不必创建临时表并使用一个查询来确定哪些整数缺失。
是否有适合此类搜索的查询?
(MySQL的)
第二种选择是最好的。 (检查速度的3种可能的写法查询方式,你编写的'LEFT JOIN - IS NULL','NOT IN'版本和'NOT EXISTS'方式。通常MySQL中的第一或第三更快。 – 2011-05-11 16:56:44
我想你想检查的id_keys不是顺序的,(1-501)只是一个例子。 – 2011-05-11 16:58:13
ypercube,正确,密钥不是顺序的。实际上可能有非常大的差距:例如100000 - 150000填充缺失的随机数,然后230000 - 400000填充缺失的随机数等。 – Clinton 2011-05-11 17:39:05