Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要关于创建SQL索引的建议_Mysql_Sql - Fatal编程技术网

Mysql 需要关于创建SQL索引的建议

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

由于主表中有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



选择电子邮件、名字、姓氏、用户名、密码、主控密码
其中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