更好的 MySQL 查询

Better MySQL Query

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

然后我有以下查询,它查找电子邮件地址并更新 table 中已经存在但未订阅的任何地址:

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 服务器),我想知道是否有更好/更快的方法来执行此操作?

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

您可以通过以下步骤获得性能-

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.