2009-07-27 5 views
6

मुझे गति के लिए एसक्यूएल प्रश्नों का परीक्षण करने के लिए एक आसान तरीका चाहिए। मैं हार्डवेयर मतभेदों के बारे में चिंतित नहीं हूं, मुझे मूल रूप से एक सापेक्ष संख्या की आवश्यकता है।कम असंगतताओं के साथ, MySQL क्वेरी गति का परीक्षण कैसे करें?

यह वही है मैं PHP के साथ कर रहा हूँ है (इसके फजी, लेकिन काम करता है):

// CONNECT TO DB HERE 

$sub = new YomoSubscription(95,783); 

$t = microtime(TRUE); 

// contains the SQL db call i'm testing 
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t; 

समस्या मैं कर रहा हूँ कि, प्रारंभिक कनेक्ट होने पर कभी कभी/मेरे परीक्षण चलाने 1.25 सेकंड लेता है उदाहरण के लिए। हालांकि बाद में कनेक्ट होने पर यह 0.004 सेकेंड लेता है ... यह क्यों है?

मैं यकीन है कि MySQL क्वेरी कैश my.ini में बंद है कर रहा हूँ:

query_cache_size=0 

उत्तर

4

आपकी पहली क्वेरी धीमी हो सकती है क्योंकि MySQL वास्तव में पहली क्वेरी पर डिस्क को मार रहा है, न कि दूसरे पर।

आपका ऑपरेटिंग सिस्टम स्मृति को फ़ाइलों को कैश कर सकता है जैसा कि वे पढ़े जाते हैं; नतीजतन, बाद में पढ़ने के लिए डिस्क को वास्तव में हिट करने की आवश्यकता नहीं हो सकती है, और बहुत तेज़ी से वापस आ जाएगी।

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

अंत में, जब क्वेरी प्रदर्शन की बात आती है, तो अधिकांश भाग के लिए, आपको इसे विकास में त्वरित पास देना चाहिए, और यह देखने के लिए उत्पादन में धीमी क्वेरी लॉग की निगरानी करनी चाहिए कि वास्तव में पर काम की आवश्यकता है।

जहां तक ​​प्रदर्शन डेटा के लिए प्रोग्रामिक रूप से चल रहे प्रश्न चलते हैं - कई नमूने लें, और औसत का उपयोग करें। लेकिन व्यावहारिक रूप से, यह वास्तविक प्रदर्शन मुद्दों के बहुत प्रतिनिधि होने वाला नहीं है जो आप उत्पादन में भाग लेंगे।

0

आप हो सकता है अपनी कक्षा में लगातार कनेक्शन का उपयोग करना। एक पैकनेक्ट कनेक्शन का पुन: उपयोग करेगा और इस प्रकार के अंतराल के लिए जिम्मेदार होगा।

2

की कि मान लेते हैं:

  1. आप सतत् कनेक्शन का उपयोग नहीं करते
  2. डेटाबेस सर्वर जहां आँकड़े किया जाता है (कोई नेटवर्क कनेक्शन)
  3. किसी और डेटाबेस का उपयोग कर रहा है (पंक्ति पर स्थापित/टेबल ताले)
  4. कोई अन्य भारी प्रक्रिया
  5. आदि चल रही है ....

तुम सच में बेंचमार्क को आपकी क्वेरी चाहते हैं, तो आपको निम्न कार्य करने के लिए है:

$database->query('SET SESSION query_cache_type = OFF'); 

तो फिर तुम क्वेरी एक पाश में 2-3 बार चलाने ("गरम" सर्वर से) ।

और उसके बाद ही:

$database->query('FLUSH STATUS'); #If you use the stats to profile your query 

$t = microtime(TRUE); 
$fp = $sub->generateFingerprint(); 
echo microtime(TRUE)-$t; 

$database->query('SHOW STATUS'); 

एट देखा !! :)))

बीटीडब्ल्यू, क्वेरी गति पढ़ने के लिए पैरामीटर में से एक है। जानें SHOW STATUS और EXPLAIN ... द्वारा लौटाई गई बहुत ही मूल्यवान जानकारी को कैसे पढ़ा जाए। यह बहुत बेहतर होगा। http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

आनंद लें:

यहाँ आप प्यार करेंगे एक कड़ी है। :)

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