更好的 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.
我有一个小型电子邮件通讯系统,当添加新电子邮件地址(通过批量导入)时,它默认为“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.