在查询中查询大量匹配的大表

时间:2012-12-18 19:21:07

标签: mysql sql

我有一个包含大约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 |
+----+-------------+-----------+-------+---------------+-----------+---------+-----------------------+------+--------------------------+

1 个答案:

答案 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

您将电子邮件放在临时表中的想法很好。如果临时表上有索引以及较大的索引,查询可能会表现得更好。