2010-10-26 11 views
8

सबसे पहले, मुझे बस इतना कहना है कि मैं PHP फ्रेमवर्क वाईआई का उपयोग कर रहा हूं, इसलिए यदि संभव हो तो मैं SQL कथन के परिभाषित सेट में रहना चाहता हूं। मुझे पता है कि मैं शायद एक बड़ा लंबा एसक्यूएल कथन बना सकता हूं जो सबकुछ करेगा, लेकिन मैं वहां नहीं जाऊंगा।MySQL में, क्या यह हटाने के लिए तेज़ है और फिर मौजूदा पंक्तियों को अपडेट करना तेज़ है या नहीं?

ठीक है, कल्पना करें कि मेरे पास एक टेबल उपयोगकर्ता और एक टेबल FavColors है। फिर मेरे पास एक ऐसा फॉर्म है जहां उपयोगकर्ता संभावित रंगों की एक बड़ी सूची से एक या अधिक चेकबॉक्स को चेक करके अपनी रंग वरीयताओं का चयन कर सकते हैं।

उन परिणामों को FavColors तालिका में कई पंक्तियों के रूप में संग्रहीत किया जाता है जैसे कि (आईडी, user_id, color_id)।

अब कल्पना करें कि उपयोगकर्ता अंदर जाता है और अपनी रंग वरीयता बदलता है। इस परिदृश्य में, डेटाबेस में नई रंग वरीयताओं को प्राप्त करने का सबसे प्रभावी तरीका क्या होगा?

विकल्प 1:

  • एक जन सभी पंक्तियों जहां user_id
  • तो सभी नए पंक्तियों की एक बड़े पैमाने पर डालने

विकल्प 2 कर से मेल खाता है की नष्ट कर सकता हूं:

  • प्रत्येक सी के माध्यम से जाएं क्या बदल गया है यह देखने के लिए यूरेनेंट पंक्ति, और
  • अपडेट करें यदि अधिक पंक्तियों को डालने की आवश्यकता है, तो ऐसा करें।
  • यदि पंक्तियों को हटाने की आवश्यकता है, तो ऐसा करें।

मैं विकल्प एक तरह है क्योंकि यह केवल दो बयानों की आवश्यकता है, लेकिन कुछ सिर्फ एक पंक्ति सिर्फ करने के लिए संभावित रूप से वापस लगभग में ठीक उसी डेटा डाल हटाने के बारे में गलत लगता है। वहाँ भी करने के लिए आईडी ऑटो वेतन वृद्धि बनाने का मुद्दा है उच्च मूल्य अधिक तेज़ी से, और मुझे नहीं पता कि जब भी संभव हो उसे टालना चाहिए।

विकल्प 2 के लिए बहुत अधिक प्रोग्रामिंग कार्य की आवश्यकता होगी, लेकिन ऐसी स्थितियों को रोक देगा जहां मैं इसे फिर से बनाने के लिए एक पंक्ति को हटा दूंगा। हालांकि, PHP में अधिक लोड जोड़ना MySQL के लिए लोड में कमी के लायक नहीं हो सकता है।

किसी भी विचार? आप सब क्या करेंगे?

उत्तर

9

UPDATE बहुत तेज़ है। जब आप UPDATE, तालिका रिकॉर्ड केवल नए डेटा के साथ फिर से लिखे जा रहे हैं। और यह सब INSERT पर फिर से किया जाना चाहिए।

जब आप DELETE, अनुक्रमित अद्यतन किया जाना चाहिए (याद रखें, आप पूरी पंक्ति, न केवल कॉलम आप संशोधित करने की आवश्यकता हटाना) और डेटा ब्लॉक ले जाया जा सकता है (यदि आप PCTFREE सीमा तक नहीं पहुंच)। नए परिवर्तनों को हटाने और जोड़ने के लिए auto_increment पर रिकॉर्ड आईडी, इसलिए यदि उन अभिलेखों में रिश्तों को तोड़ दिया जाएगा, या अपडेट की भी आवश्यकता होगी। मैं UPDATE के लिए जाना होगा।

यही कारण है कि आपको REPLACE के बजाय INSERT ... ON DUPLICATE KEY UPDATE पसंद करना चाहिए।

पूर्व एक, एक प्रमुख उल्लंघन के मामले में एक UPDATE ऑपरेशन है, जबकि दूसरा एक DELETE/INSERT

अद्यतन है: यहाँ एक उदाहरण INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

अधिक जानकारी के लिए अद्यतन पढ़ने documentation

+1

यदि कोई अनुक्रमित फ़ील्ड अपडेट कर रहा है, तो सूचकांक भी –

+0

@OMG हाँ अपडेट किया गया है! इसका जिक्र करना भूल गए। अच्छा है कि आपने किया ... –

+0

धन्यवाद, यह समझ में आता है। दुर्भाग्यवश, जब आप ActiveRecord के आधार पर एक फ्रेमवर्क का उपयोग कर रहे हैं, तो कस्टम एसक्यूएल कथन बनाने में हमेशा आसान नहीं होता है और "INSERT ... डिप्लिकेट कुंजी अपडेट" शामिल होता है। यदि मैं ऐसा करता हूं, तो मुझे मैन्युअल रूप से एक क्वेरी बनाना होगा, और यदि संभवतः मुझे भविष्य में डीबीएमएस स्विच करने की आवश्यकता है तो वह क्वेरी अनुवाद नहीं करेगी। –

1

है फिलिप, क्या आपने तैयार वक्तव्य करने की कोशिश की है? तैयार बयानों के साथ आप एक पैरामीटर को विभिन्न मानकों के साथ बैच कर सकते हैं और इसे कई बार कॉल कर सकते हैं। अपने लूप के अंत में, आप उन सभी को नेटवर्क विलंबता की न्यूनतम मात्रा के साथ निष्पादित कर सकते हैं। मैंने php के साथ तैयार कथन का उपयोग किया है और यह बहुत अच्छा काम करता है। जावा तैयार बयान से थोड़ा अधिक भ्रमित।

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