2012-06-07 18 views
9

मेरे पास BINARY(20) की प्राथमिक कुंजी के साथ एक बहुत बड़ी तालिका है।ऑन डिप्लिकेट कुंजी अपडेट के लिए डाली गई पंक्तियों की संख्या प्राप्त करना एकाधिक डालने?

तालिका में लगभग 17 मिलियन पंक्तियां हैं। प्रत्येक घंटे एक क्रॉन नौकरी ON_DUPLICATE_KEY_UPDATE वाक्यविन्यास के साथ इस तालिका में 50,000 नई प्रविष्टियों को सम्मिलित करने का प्रयास करती है।

cronjob में प्रत्येक डालने 1,000 मान (एकाधिक डालने) के साथ है। मैं इस क्वेरी से तालिका में डाली गई पंक्तियों की संख्या कैसे प्राप्त कर सकता हूं? मैं पहले और बाद में पंक्ति गणना नहीं कर सकता क्योंकि लगभग 17 मिलियन पंक्तियां हैं और क्वेरी बहुत महंगा है।

मैनुअल MySQL में कहते हैं के लिए एक पंक्ति सम्मिलित की पंक्तियों के प्रभावित संख्या 1 है और एक अद्यतन क्षेत्र यह 2 है, नकली चाबी अद्यतन क्वेरी पर अपने 1000 सम्मिलित में अर्थ मैं 1000 से लेकर प्रभावित पंक्तियों हो सकता था के लिए - 2000, लेकिन मेरे पास यह बताने का कोई तरीका नहीं है कि इस नंबर से कितने रिकॉर्ड डाले गए थे?

मैं इसे कैसे दूर कर सकता हूं?

धन्यवाद

उत्तर

11

आवेषण की संख्या 2000 शून्य से प्रभावित पंक्तियों की संख्या होगी। अधिक आम तौर पर:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

संपादित करें:

tomas points out के रूप में, MySQL docs वास्तव में कहते हैं:

पर नकली चाबी अद्यतन के साथ, प्रति पंक्ति प्रभावित-पंक्तियों मान 1 यदि पंक्ति है एक नई पंक्ति के रूप में डाला जाता है, 2 यदि कोई मौजूदा पंक्ति अद्यतन हो जाती है, और 0 यदि कोई मौजूदा पंक्ति अपने वर्तमान मानों पर सेट है

[जोर मेरा]

नतीजतन, अगर एक ही मूल्यों के लिए कोई मौजूदा पंक्ति की स्थापना एक संभावना है, यह बताने के लिए कि कितने पंक्तियों बनाम डाला अपडेट किए गए थे, के बाद से दो आवेषण एक से पृथक किया जाएगा असंभव है अलग-अलग मानों के साथ अपडेट करें + एक ही मान के साथ एक अपडेट।

+0

मेरा गणित सबसे अच्छा नहीं है, मैं इस लॉल के चारों ओर अपना सिर नहीं प्राप्त कर सकता, मैं कुछ परीक्षण करूँगा, धन्यवाद दोस्त। – Griff

+0

वास्तव में आप सही हैं धन्यवाद दोस्त मेरे दिन बचाया :) – Griff

+0

यह एस्सार मानता है कि हम प्रत्येक पंक्ति के लिए या तो 1 या 2 प्राप्त करेंगे। MySQL दस्तावेज़ों से: INSERT के लिए ... डिप्लिकेट कुंजी अपडेट स्टेटमेंट्स पर, प्रति पंक्ति प्रभावित प्रभावित पंक्ति 1 है यदि पंक्ति एक नई पंक्ति के रूप में डाली जाती है, 2 यदि कोई मौजूदा पंक्ति अपडेट की जाती है, और 0 मौजूदा पंक्ति अपने वर्तमान मानों पर सेट है तो मुझे लगता है कि अगर कोई मौजूदा पंक्ति अपरिवर्तित बनी हुई है, तो हमें 0 मिल जाएगा और यह काम नहीं करेगा ..:/ – tomas

6

जब आपका काम 1000 का सम्मिलित करता है, तो कुछ शुद्ध आवेषण होते हैं और कुछ अपडेट होते हैं क्योंकि आपके पास ON_DUPLICATE_KEY_UPDATE है। इस प्रकार आप पहली बार समीकरण प्राप्त

(1) आवेषण + अपडेट = सम्मिलित किया गया

मैं एक साधारण उदाहरण है जहाँ आप my_sql_affected_rows के लिए 1350 एक मूल्य मिल लेने (इस मामले 1000 में) पंक्तियों की कोई। क्योंकि 1 के मान को सम्मिलित करने के लिए और my_sql_affected_rows पर 2 योगों के मान को अपडेट करने के लिए। मुझे निम्नलिखित समीकरण मिलता है।

(2) सम्मिलित + 2 * अपडेट = my_sql_affected_rows (इस मामले में 1350)।

घटाना (2) - (1)। आप प्राप्त

(3) अपडेट = my_sql_affected_rows - कोई

सम्मिलित की गईं पंक्तियां का अद्यतन = 1350 - 1000 (इस उदाहरण में)।

अद्यतन = 350। समीकरण में अपडेट की

स्थानापन्न मूल्य (1), आप

आवेषण = 650

इस प्रकार अपडेट की संख्या प्राप्त करने के लिए, आप केवल (3) सीधे समीकरण उपयोग करने की आवश्यकता हो।

+0

तो यह माना जाता है कि दोनों आवेषण और अद्यतन हैं, जो हमेशा मामला नहीं है। यह अन्य मामलों में से एक हो सकता है: केवल आवेषण, केवल अपडेट, कोई आवेषण या अपडेट नहीं। क्या इन मामलों में शुद्ध आवेषण की संख्या जानना संभव है? – satoru

+0

समीकरण (1) यहां सटीक नहीं है क्योंकि यदि कोई पंक्ति अपने वर्तमान मानों पर सेट की जाती है, तो हमें 0 मिलते हैं। इसलिए आपको मिल जाएगा: (1) सम्मिलित करें + अपडेट + अपरिवर्तित = पंक्तियों की संख्या सम्मिलित नहीं है। जो 3 चर देता है और यह असफल बनाता है: / – tomas

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