2010-03-05 15 views
12

मेरे पास 1 9 000 000 रिकॉर्ड के साथ काफी बड़ी तालिका है, और मुझे डुप्लिकेट पंक्तियों में समस्या है। यहां SO में भी बहुत सारे प्रश्न हैं, लेकिन उनमें से कोई भी मुझे संतोषजनक उत्तर नहीं देता है। कुछ बिंदुओं पर विचार करने के लिए:बड़ी तालिका से डुप्लिकेट हटाना

  • पंक्ति विशिष्टता दो कॉलम, location_id और datetime से निर्धारित होता है।
  • मैं निष्पादन समय जितनी जल्दी हो सके रखना चाहता हूं (< 1 घंटा)।
  • टेबल कॉपी करना बहुत व्यवहार्य नहीं है क्योंकि तालिका आकार में कई गीगाबाइट है।
  • संबंधों के बारे में चिंता करने की कोई आवश्यकता नहीं है।

के रूप में कहा, हर location_id केवल एक विशिष्ट datetime हो सकता है, और मैं सभी डुप्लिकेट निकालते रहें करना चाहते हैं। इससे कोई फर्क नहीं पड़ता कि उनमें से कौन सा जीवित रहता है, क्योंकि डेटा समान है।

कोई विचार?

+3

अस्थायी रूप से अनुक्रमित करने के लिए विचार करें, अगर मौजूद है तो ट्रिगर्स। – Pentium10

+0

http://stackoverflow.com/questions/1585412/sql-to-delete-duplicate-records-in-a-table में दिए गए दृष्टिकोण के साथ क्या गलत था? – Mike

+0

@ पेंटियम 10, अच्छा बिंदु, चीजों को गति दे सकता है, लेकिन यदि मैं सबक्वायरी समाधान के माध्यम से जाता हूं तो प्रदर्शन भी मार सकता है। –

उत्तर

15

अपने तालिका स्तंभ पर निर्भर करता है, मुझे लगता है कि आप ऐसा करने से पहले तालिका

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime) 

से डुप्लिकेट रिकॉर्ड को हटाने के लिए इस क्वेरी का उपयोग कर सकते , बस कुछ नमूना डेटा के साथ परीक्षण करें .. और फिर इसे आजमाएं ....

नोट: संस्करण 5.5 पर, यह MyISAM पर काम करता है लेकिन InnoDB नहीं।

+0

का समूह होता है, यह आशाजनक लगता है, मैंने पहले इस सुविधा के बारे में नहीं सुना था। इसे अभी आज़माकर, मैं आपको बता दूंगा कि यह कैसे निकलता है। और एसओ में आपका स्वागत है :) –

+6

यह काम किया, धन्यवाद। 1 58 9 908 डुप्लिकेट के साथ 16 982 040 पंक्तियों के माध्यम से जाने के लिए 31 मिनट लग गए।मुझे विश्वास नहीं है कि यह कोई आसान टेबल या जटिल प्रश्नों के साथ, यह आसान हो सकता है। :) –

+0

@ विनोदकुमार सरवाना, मैं इनो डीबी के साथ 5.5 चला रहा हूं, मैंने आपका नोट पढ़ा लेकिन मैंने इसे सुनिश्चित करने के लिए किसी भी तरह से कोशिश की। (बेशक यह काम नहीं किया), लेकिन क्या आप कृपया बता सकते हैं कि यह InnoDB पर क्यों काम नहीं करता है? – tixastronauta

1
SELECT *, COUNT(*) AS Count 
FROM table 
GROUP BY location_id, datetime 
HAVING Count > 2 
0
UPDATE table SET datetime = null 
WHERE location_id IN (
SELECT location_id 
FROM table as tableBis 
WHERE tableBis.location_id = table.location_id 
AND table.datetime > tableBis.datetime) 

SELECT * INTO tableCopyWithNoDuplicate FROM table WHERE datetime is not null 

DROp TABLE table 

RENAME tableCopyWithNoDuplicate to table 

तो तुम कम datetime के साथ लाइन रखने के लिए। मैं पर्फ़ के बारे में निश्चित नहीं हूँ, यह आपके सर्वर आदि ...

0

यह क्वेरी हर मामले के लिए पूरी तरह से काम करती है: इंजन के लिए परीक्षण: MyIsam 2 मिलियन पंक्तियों के लिए।

ALTER ध्यान न दें टेबल TABLE_NAME जोड़ें अद्वितीय (location_id, datetime)

0

आप इन चरणों का उपयोग करके डुप्लीकेट हटा सकते हैं:

select dup_col from table1 group by dup_col having count(dup_col) > 1 

2- जोड़ें: 1- निर्यात एक txt फ़ाइल में निम्न क्वेरी के परिणाम txt फ़ाइल ऊपर की पहली को यह और अंतिम क्वेरी चलाने:

delete from table1 where dup_col in (.....) 

कृपया ध्यान दें कि '...' मैं बनाया txt फ़ाइल की सामग्री को है पहला कदम।

संबंधित मुद्दे