我有一个包含大约8亿条记录的电子邮件表,我需要将其与大约100,000封电子邮件列表进行匹配。数据库中的电子邮件条目已编制索引。
最好的查询是什么?我已经尝试创建一个临时表,其中包含我要匹配的条目,然后针对该表和主表执行SELECT,但似乎它应该比它更快 - 多个查询似乎变慢。有什么建议吗?
服务器在CentOS 6.3上运行MySQL 5.5.27。
编辑:以下是创建声明:
CREATE TEMPORARY TABLE temptable (Email varchar(50))
CREATE INDEX tempindex ON temptable (Email)
这是我的疑问:
SELECT temptable.Email FROM temptable, biglist WHERE temptable.Email = biglist.Email
这是EXPLAIN的结果:
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
| 1 | SIMPLE | temptable | index | tempindex | tempindex | 53 | NULL | 21 | Using index |
| 1 | SIMPLE | biglist | ref | idx_Email | idx_Email | 202 | datab.temptable.email | 1 | Using where; Using index |
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+
答案 0 :(得分:1)
您正在寻找类似的东西:
select emailaddress,
(case when bg.emailaddress is NULL then 'MISSING' else 'PRESENT' end)
from TEMPemail te left outer join
BigTable bg
on te.emailaddress = bg.emailaddress
您将电子邮件放在临时表中的想法很好。如果临时表上有索引以及较大的索引,查询可能会表现得更好。