有关创建SQL索引的建议

时间:2020-02-25 16:08:03

标签: mysql sql

由于主数据库中有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



1 个答案:

答案 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列中,它将仅查找匹配的行。