2010-02-01 17 views
17

मैं एक MySQL डेटाबेस पर "बार से चयन करें (foo) क्वेरी" कर रहा हूं जो 7.3 मिमी रिकॉर्ड को जोड़ रहा है और लगभग 22 सेकंड प्रति रन ले रहा है। क्या MySQL में रकम को तेज करने के लिए कोई चाल है?क्या MySQL में एक योग() को तेज करना संभव है?

+0

यह संभव है हालांकि अन्य डेटाबेस; पूर्व। [ओरेकल] (http://en.wikipedia.org/wiki/Materialized_view), [एमएस एसक्यूएल] (http://technet.microsoft.com/library/Cc917715), –

उत्तर

24

नहीं, आप फ़ंक्शन को तेज़ नहीं कर सकते हैं। यहां समस्या वास्तव में है कि आप 7.3 मिलियन रिकॉर्ड का चयन कर रहे हैं। MySQL को पूरी तालिका स्कैन करना है, और 7.3 मिलियन एक बहुत बड़ी संख्या है। मुझे प्रभावित है कि यह वास्तव में तेज़ खत्म होता है।

एक रणनीति आप को काम कर सकता है आपके डेटा (शायद तारीख? महीना?) के द्वारा छोटे सबसेट में तोड़ने के लिए और पुराने डेटा के लिए कुल राशि है कि बदलने के लिए नहीं जा रहा है बनाए रखने के लिए किया जाएगा। आप समय-समय पर योग को अपडेट कर सकते हैं, और कुल मूल्य की गणना राशि जोड़कर की जा सकती है, और उसके बाद से जोड़ा गया कोई भी नया डेटा, जो कि पंक्तियों की एक छोटी संख्या होगी।

3

नहीं, वास्तव में नहीं। इसे हमेशा तालिका में सभी पंक्तियों को गिनना होगा।

आप एक अतिरिक्त तालिका बनाने और हर डालने, अद्यतन पर वहाँ में योग को अपडेट कर सकता है, हटाना चाहते हैं?

0

अगर आपकी क्वेरी वास्तव में है कि सरल, नहीं ... लेकिन अपने एक अधिक जटिल क्वेरी उपयोग कर रहे हैं (और यह यहां संक्षिप्त) आप जा सकते थे (शायद) - का उपयोग कर बेहतर मिलती है ...

9

बारी की तरह MySQL में QUERY कैच पर। डिफ़ॉल्ट रूप से कैशिंग बंद है। आपको mysql ini फ़ाइल सेट करने की आवश्यकता है।

-- hint mysql server about caching 
SELECT SQL_CACHE sum(foo) FROM bar; 

MySQL ऑप्टिमाइज़र तालिका में कोई परिवर्तन नहीं किए जाने पर कैश वापस करने में सक्षम हो सकता है।

यहां अधिक पढ़ें: http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

+0

कैश किए गए मान को मूल्य के दौरान अपडेट किया जाएगा 'foo' का अपडेट हो जाता है? या अगली बार यह क्वेरी चलाने के बाद MySQL फिर पूरी तालिका को दोबारा जोड़ देगा? –

+1

@ ब्लूराजा-डैनीफ्लूघोएफ्ट कैश साफ़ कर दिया जाएगा और यह पूरी तालिका को दोबारा जोड़ देगा। कॉलम का जिक्र करते हुए –

1

आप शायद bar.foo मैदान पर एक सूचकांक से जोड़ने का प्रयास कर सकते हैं। इंडेक्स में बार कॉलम के सभी मान होंगे, लेकिन मूल फू टेबल की तुलना में स्कैन करने के लिए तेज़ छोटा है, खासकर यदि foo में कई अन्य कॉलम हैं। यहाँ

+0

निश्चित गलती। bar.foo होना चाहिए, foo.bar नहीं। @ हैरी-बी के लिए धन्यवाद – hongliang

8

दो बातें:

1) आप नियमित आधार पर 7.3m रिकॉर्ड के लिए राशि नहीं करना चाहिए - व्यापार की जरूरत (की सेवा दिन, महीने, साल, विभाग, आदि द्वारा मचान तालिकाओं) लागू करने और उन पर भरने अनुसूचित आधार, संभवतः मूल 'कच्चे' तालिका के बजाय उन तालिकाओं का पुन: उपयोग (जैसे संक्षेप मूल्य प्रत्येक दिन है जब आप कुछ दिनों के अंतराल की जरूरत के लिए, आदि का चयन)

2) अपने लेन-देन की जांच सेटिंग्स

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

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