更好的MySQL查询

时间:2016-02-08 12:01:47

标签: mysql mysqli subquery

我有一个小型电子邮件简报系统,当添加新的电子邮件地址时(通过批量导入),默认为“subscribed int(11)DEFAULT'1'`”。

然后我有以下查询查找电子邮件地址并更新表中已有但未订阅的任何内容:

UPDATE emailData SET subscribed =  '0'
WHERE subscribed = '1' and emailAddress IN

(
  SELECT emailAddress FROM
  (SELECT emailAddress FROM emailData  WHERE subscribed = '0' GROUP BY emailAddress) AS tmptable

) 

大约有5000个重复项需要大约15秒才能执行(VM Server),我想知道是否有更好/更快的方法来执行此操作?

此致 克里斯

2 个答案:

答案 0 :(得分:0)

是的,有更好的方法 - 没有重复。在电子邮件地址上创建一个唯一的(主?)索引,并将导入操作设置为忽略重复项(否则它仍将执行导入但会产生大量错误)。

答案 1 :(得分:-1)

您可以通过以下步骤获得表现 -

1. Need to change query as per below-

    UPDATE emailData AS ed JOIN emailData AS ed1 
    ON ed.emailAddress = ed1.emailAddress 
    SET ed.subscribed =  '0'
    WHERE ed.subscribed = '1' AND ed1.subscribed = '0';

2. emailAddress field data length should be short as much possible may be varchar(50) or varchar(60) if possible.

3. make a composit index on emailAddress and subscribed fields.

Note: If emailAddress field is text or like varchar(250) etc and you can't short it then make partial index like first 50 characters only which will be enough and fast.