समय प्रोफाइलिंग बर्बाद मत करो। समय हमेशा डेटाबेस संचालन में है। जितना संभव हो उतना करो। बस आवेषण की न्यूनतम संख्या।
तीन चीजें।
वन। दिनांक, होस्टनाम और व्यक्ति आयामों को अनुरूप बनाने के लिए बार-बार चयन न करें। एक ही पायथन शब्दकोश में सभी डेटा एक बार लाएं और इसे स्मृति में उपयोग करें। दोहराना सिंगलटन का चयन न करें। पायथन का प्रयोग करें।
दो। अपडेट न करें
विशेष रूप से, ऐसा मत करें। यह दो कारणों से खराब कोड है।
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
इसे एक साधारण चयन COUNT (*) से बदल दिया गया है ...। गिनती बढ़ाने के लिए कभी भी अपडेट न करें। बस एक पंक्ति कथन के साथ पंक्तियों की गिनती करें। [यदि आप इसे सरल चयन COUNT या SELECT COUNT (DISTINCT) के साथ नहीं कर सकते हैं, तो आप कुछ डेटा खो रहे हैं - आपका डेटा मॉडल हमेशा सही पूर्ण गणना प्रदान करना चाहिए। कभी अपडेट न करें।]
और। स्ट्रिंग प्रतिस्थापन का उपयोग करके कभी भी SQL का निर्माण न करें। पूरी तरह से गूंगा।
यदि किसी कारण से SELECT COUNT(*)
पर्याप्त तेज़ नहीं है (पहले किसी भी लंगड़े से पहले बेंचमार्क) तो आप किसी अन्य तालिका में गिनती के परिणाम को कैश कर सकते हैं। सभी भार के बाद। SELECT COUNT(*) FROM whatever GROUP BY whatever
करें और इसे गणना की एक तालिका में डालें। अपडेट न करें कभी।
तीन। बाइंड वैरिएबल का प्रयोग करें। हमेशा।
cursor.execute("INSERT INTO ... VALUES(%(x)s, %(y)s, %(z)s)", {'x':person_id, 'y':time_to_string(time), 'z':channel,})
एसक्यूएल कभी नहीं बदलता है। मूल्य परिवर्तन में बंधे हैं, लेकिन एसक्यूएल कभी नहीं बदलता है। यह बहुत तेज़ है। गतिशील रूप से एसक्यूएल कथन कभी न बनाएं। कभी नहीँ।
स्रोत
2008-09-26 01:50:23
अपडेट किया गया है क्योंकि बाद में चालू (रेल अनुप्रयोग पर रूबी में) मैं तुरंत यह जानना चाहता हूं कि उपयोगकर्ता की कितनी लाइनें हैं। यह संख्या सैद्धांतिक रूप से कभी गलत नहीं होनी चाहिए, और तेज़ी से होगी। बाइंड वैरिएबल सिंटैक्स गलत है (इसलिए यह मेरे psycopg2 के लिए लगता है), कुछ ऐसा काम करेगा जो काम करेगा? –
क्या आपने psycopg2 विशिष्ट बाइंड परिवर्तनीय वाक्यविन्यास के बारे में मेरे अन्य उत्तर में मेरी टिप्पणी पढ़ी? –
एक सारणी पर एक चुनिंदा गिनती (*) जिसमें एक इंडेक्स है (किसी भी इंडेक्स को पर्याप्त होना चाहिए) बहुत तेज़ ऑपरेशन है क्योंकि तत्वों की संख्या सीधे इंडेक्स में संग्रहीत होती है। पहले अद्यतन गणना का चयन करना कोई तेज़ नहीं होना चाहिए। – gooli