【问题标题】:Speed up MySQL join to check for duplicates加快 MySQL 连接以检查重复项
【发布时间】:2011-06-10 05:03:11
【问题描述】:

我正在使用以下查询返回具有相同名字和姓氏的所有重复记录。诀窍是contact_id必须按降序排列。

查询按预期返回联系人,但速度太慢了!检查大约 30,000 条记录时大约需要 6-8 秒。

我在数据库中索引了contact_firstName、contact_lastName、contact_client_id 和contact_id。

有什么想法可以尝试加快速度吗?感谢您的帮助:)

SELECT z.contact_id, z.contact_firstName, z.contact_lastName, RIGHT(z.contact_lastName,1) AS nameNum
FROM (`contacts` x) 
JOIN `contacts` z ON `x`.`contact_firstName` = `z`.`contact_firstName` 
AND x.contact_lastName = z.contact_lastName 
AND x.contact_client_id = ".$ID." 
AND z.contact_client_id = ".$ID." 
WHERE `x`.`contact_id` < `z`.`contact_id` 
GROUP BY `z`.`contact_id` 

【问题讨论】:

标签: mysql duplicates performance indexed


【解决方案1】:

没有做出任何承诺,但这里有一个替代方案:

SELECT c.contact_id, c.contact_firstName, c.contact_lastName, RIGHT(c.contact_lastName,1) AS nameNum
    FROM (SELECT contact_firstName, contact_lastName, MIN(contact_id) AS MinID
              FROM contacts
              WHERE contact_client_id = ".$ID."
              GROUP BY contact_firstName, contact_lastName
              HAVING COUNT(*) > 1) t
        INNER JOIN contacts c
            ON t.contact_firstName = c.contact_firstName
                AND t.contact_lastName = c.contact_lastName
                AND c.contact_client_id = ".$ID."
                AND t.MinID <> c.contact_id

【讨论】:

  • 就是这样。像魅力一样工作。谢谢乔:)
【解决方案2】:
SELECT z.contact_id, z.contact_firstName, z.contact_lastName
, RIGHT(z.contact_lastName,1) AS nameNum
FROM `contacts` x
JOIN `contacts` z ON (x.contact_client_id = z.contact_client_id)
WHERE `x`.`contact_id` < `z`.`contact_id` 
And x.contact_client_id = '$id'
GROUP BY `z`.`contact_id` 

确保您有以下索引:
- 联系人 ID。
-contact_client_id

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多