प्रोफाइलिंग में समय बर्बाद न करें। समय हमेशा डेटाबेस संचालन में होता है। जितना हो सके कम करें। सम्मिलित करने की न्यूनतम संख्या।
तीन चीजें।
एक। दिनांक, होस्टनाम और व्यक्ति आयामों के अनुरूप होने के लिए बार-बार चयन न करें। एक बार सभी डेटा को पायथन डिक्शनरी में प्राप्त करें और इसे मेमोरी में उपयोग करें। बार-बार सिंगलटन चयन न करें। पायथन का प्रयोग करें।
दो। अपडेट न करें।
विशेष रूप से, ऐसा न करें। यह दो कारणों से खराब कोड है।
cursor.execute("UPDATE people SET chats_count = chats_count + 1 WHERE id = '%s'" % person_id)
इसे एक साधारण SELECT COUNT(*) FROM ... से बदला जा सकता है। गिनती बढ़ाने के लिए कभी भी अपडेट न करें। केवल उन पंक्तियों को गिनें जो एक चयन कथन के साथ हैं। [यदि आप इसे एक साधारण SELECT 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,} )
एसक्यूएल कभी नहीं बदलता है। मान परिवर्तन में बंधे हैं, लेकिन SQL कभी नहीं बदलता है। यह बहुत तेज है। कभी भी SQL स्टेटमेंट को गतिशील रूप से न बनाएं। कभी नहीँ।