2011-06-09 46 views
1

我正在使用以下查詢來返回具有相同姓氏和名字的所有重複記錄。訣竅是contact_id必須按降序排列。加速MySQL加入以檢查重複項

查詢按預期返回聯繫人,但它只是如此慢!檢查大約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` 
+2

的反引號! *我的眼睛!* – 2011-06-09 21:07:11

+0

@djacobson:我感謝他們。他們可以更容易地篩選出什麼是領域。 – 2011-06-09 21:10:49

+0

收到答案在這裏:http://stackoverflow.com/questions/11336246/mysql-min-group-by-on-large-tables-8000-rows – 2012-07-05 16:01:56

回答

0
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` 

確保您有一個指標:
- CONTACT_ID。
- contact_client_id

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 
+0

就是這樣。像魅力一樣工作。謝謝喬:) – 2011-06-09 21:50:53