更好的MySQL查询

更好的MySQL查询,mysql,mysqli,subquery,Mysql,Mysqli,Subquery,我有一个小型的电子邮件通讯系统,当添加一个新的电子邮件地址时(通过批量导入),它默认为“subscribedint(11)DEFAULT'1`” 然后,我进行以下查询,查找电子邮件地址并更新表中已存在但未订阅的任何电子邮件地址: UPDATE emailData SET subscribed = '0' WHERE subscribed = '1' and emailAddress IN ( SELECT emailAddress FROM (SELECT emailAddress

我有一个小型的电子邮件通讯系统,当添加一个新的电子邮件地址时(通过批量导入),它默认为“
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个副本,执行(VM服务器)大约需要15秒,我想知道是否有更好/更快的方法

问候,,
克里斯

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

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

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.

这并不一定有什么区别,但请注意“1”是一个字符串。1是一个整数。“emailAddress字段数据长度应尽可能短…”-首先,如果其索引正确,则不会产生影响,其次:,第三,如果它是一个varchar字段,并且没有正确索引,那么比较的成本是由数据的长度而不是属性的最大大小决定的。@symcbean:这里我不是说什么是电子邮件的标准长度,只是说如果可以保持长度短一些更好,如果可能的话,其他方式创建部分索引…索引的长度无论在性能上是否重要…您可以通过一个具有数十亿行和文本列的实际示例来验证…“如果可以保持长度较短,则更好”-不,截断数据绝对不是更好-部分电子邮件地址是无用的,它对性能没有影响,我不知道您在本文中所说的“部分索引”是什么意思(你是说前缀索引吗)?选择性较低的索引如何提高性能?@symcbean:即使在否定的情况下,你也错误地理解了我的陈述。我的意思是假设所有电子邮件的长度都在varchar(60)以下,然后将长度保持为varchar(80)或100…如果不是这样,并且90%的电子邮件都在50字符以下,那么可以使用前缀索引(部分索引)左边50个字符将满足最大情况,而不满足查询的字符将进行表扫描,这将是罕见的罕见情况。