由于主数据库中有40K条记录,第二个表中有5000行,因此执行此SQL查询要花费13秒钟以上的时间。
任何人都可以告诉要创建的索引吗?我已经创建了到期日期和电子邮件作为组合索引,但是不起作用。
SELECT email,first_name,last_name,userid,PASSWORD,cons FROM MASTER
WHERE expirydate <='2020-02-27'
AND email NOT IN (SELECT (email) FROM bounce_emails_amazon)
EXPLAIN
1 PRIMARY MASTER \N ALL expdate_email,expemail.userid \N \N \N 38228 60.75 Using where
2 SUBQUERY bounce_emails_amazon \N index email email 103 \N 3567 100.00 Using index
答案 0 :(得分:2)
我建议:
ALTER TABLE `master` ADD INDEX (expirydate);
ALTER TABLE `bounce_emails_amazon` ADD INDEX (email);
然后使用@Alex建议的排除联接查询(我将在此处包括):
SELECT
m.email,
m.first_name,
m.last_name,
m.userid,
m.PASSWORD,
m.cons
FROM MASTER m
LEFT JOIN bounce_emails_amazon b
ON b.email = m.email
WHERE m.expirydate <='2020-02-27'
AND b.email IS NULL
更好的原因是,使用子查询显示的原始查询可能会扫描整个bounce_emails_amazon
,以查找外部查询的每一行。通过使用联接,并将索引添加到email
列中,它将仅查找匹配的行。