我正在使用Google BigQuery,并且正在从PHP执行一些简单的查询。(例如,从电子邮件中的SELECT * WHERE email='mail@test.com‘)我只是在检查表中是否存在该电子邮件。
表“电子邮件”目前为空。但是,PHP脚本仍然需要大约4分钟的时间来检查一个空表上的175封电子邮件。.如我希望将来该表将被填充,并且将有500 000封邮件,那么我想请求时间会更长。
那正常吗?还是有什么想法/解决方案来缩短检查时间?
(PS:表“电子邮件”仅包含8列,均为字符串类型)
谢谢 !
如果仅检查字段的存在,请考虑使用SELECT COUNT(*) FROM emails where email='mail@test.com'代替。这将只需要读取一个字段,因此将花费更少,并且在大型表上会更快。
SELECT COUNT(*) FROM emails where email='mail@test.com'
就像Pentium10建议的那样,请考虑在单个查询中使用多个查询。您可以这样做:
SELECT SUM((IF(email = 'mail1@test.com', 1, 0)) as m1, SUM((IF(email = 'mail2@test.com', 1, 0)) as m2, SUM((IF(email = 'mail3@test.com', 1, 0)) as m3, ... FROM emails
您将在单个查询中受限于诸如64k之类的内容,但是它应该非常快速地进行计算,因为它只需要在一次扫描中扫描单个列即可。
或者,如果您希望每行发送一封电子邮件,则可以做一些更奇特的操作,例如
SELECT email FROM emails WHERE email IN ('mail1@test.com', 'mail2@test.com', 'mail3@test.com'...) GROUP BY email
作为进一步的优化,您可以将其作为LEFT JOIN来完成:
SELECT t1.email as email, IF(t2.email is not null, true, false) as found FROM [interesting_emails] t1 LEFT OUTER JOIN [emails] t2 ON t1.email = t2.email
如果funous_emails包含您要检查的电子邮件列表,例如
mail1@test.com mail2@test.com mail3@test.com
如果电子邮件表仅包含mail1 @和maiil2 @,那么您将得到以下结果:
email found ______________ _____ mail1@test.com true mail2@test.com false mail3@test.com true
这样做的好处是,如果需要,它可以扩展到数十亿封电子邮件(当数量增加时,您可以考虑使用JOIN EACH而不是JOIN)。