Mysql 需要关于创建SQL索引的建议
由于主表中有40K条记录,第二个表中有5000行,因此执行此SQL查询需要13秒以上的时间 有人能告诉我们要创建的索引吗?我已经创建了失效日期和电子邮件作为组合索引,但不起作用Mysql 需要关于创建SQL索引的建议,mysql,sql,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_amazo
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
选择电子邮件、名字、姓氏、用户名、密码、主控密码
其中expirydate我建议:
ALTER TABLE `master` ADD INDEX (expirydate);
ALTER TABLE `bounce_emails_amazon` ADD INDEX (email);
然后使用@Alex建议的排除连接查询(我将在这里包括它):
选择
m、 电子邮件,
m、 名字,
m、 姓,
m、 用户ID,
m、 密码,
m、 缺点
来自m大师
左加入反弹\u电子邮件\u亚马逊b
在b.email=m.email上
在m.expirydate的哪里,您可以为该查询共享EXPLAIN
。@Nico Haase这是添加的EXPLAIN语句结果JOIN可能会稍微快一点,但与索引相比,改进似乎很小。事实上,一个主表中有40K行,amazon_bounce中有1K行的查询分析器将53%的旧数据和47%的数据分离,以进行连接-实际上是边缘化的,但是如果必须对1K表进行完全扫描,这并不好,可能是40000次,对吗?我添加了解释语句,想知道为什么键仍然没有应用到主表上。但是,现在执行时间小于0.10秒。expirydate
上的条件是否与表中的大部分匹配?如果匹配太常见,MySQL将跳过使用索引。
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