2012-11-27 18 views
7

मैं निम्न क्वेरीCOUNT (DISTINCT फ़ील्ड 1) के प्रदर्शन में सुधार कैसे करें ... फ़ील्ड 2 द्वारा समूह?

EXPLAIN SELECT COUNT(DISTINCT ip_address) as ip_address, exec_date 
    FROM requests 
    GROUP BY exec_date; 

id select_type table  type  possible_keys key   key_len ref  rows Extra 
1 SIMPLE  requests range  NULL   daily_ips 263  NULL 488213 Using index for group-by (scanning) 

एक कवर सूचकांक daily_ips

Table  Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment 
requests 1   daily_ips 1    exec_date A   16   NULL  NULL YES BTREE  
requests 1   daily_ips 2    ip_address A   483492  NULL  NULL YES BTREE  

के साथ वहाँ किसी भी तरह से मैं आगे इस क्वेरी अनुकूलन कर सकते हैं है है?

Using index for group-by (scanning) का क्या अर्थ है? क्या इसका मतलब यह है कि पूरे GROUP BY खंड पूरी तरह से एक इंडेक्स से किया जाता है जबकि COUNT(DISTINCT ip_address) कथन का हिस्सा नहीं है?

उत्तर

3

आपके द्वारा प्रदान किए गए डेटा के आधार पर, मुझे कोई तरीका नहीं दिखता है कि आप क्वेरी को और अनुकूलित कर सकते हैं।

अपने अनुवर्ती प्रश्न के रूप में, MySQL मैनुअल Using index for group-by के लिए उत्पादन की व्याख्या का वर्णन पेज का कहना है:

, का उपयोग करते हुए सूचकांक तालिका अभिगम विधि के समान समूह-से सूचकांक का प्रयोग इंगित करता है कि MySQL के एक सूचकांक में पाया गया कि वास्तविक तालिका में किसी भी अतिरिक्त डिस्क पहुंच के बिना ग्रुप बाय या DISTINCT क्वेरी के सभी कॉलम पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है। इसके अतिरिक्त, सूचकांक का सबसे प्रभावी तरीके से उपयोग किया जाता है ताकि प्रत्येक समूह के लिए केवल कुछ इंडेक्स प्रविष्टियां पढ़ी जाएंगी। विवरण के लिए, Section 8.13.10, “GROUP BY Optimization” देखें।

आपकी अनुक्रमणिका विशेष रूप से आपकी क्वेरी को तेज करने के लिए उपयुक्त है। चूंकि केवल अनुक्रमित फ़ील्ड का चयन किया जा रहा है (आपकी क्वेरी में प्रत्येक कॉलम इंडेक्स में भी दिखाई देता है), MySQL को तालिका को हिट करने की भी आवश्यकता नहीं है, क्योंकि सभी प्रासंगिक डेटा इंडेक्स में दिखाई देते हैं।

यदि कोई प्रश्न निष्पादित करना google पर एक खोज करने जैसा था, तो किसी भी लिंक की गई साइटों पर क्लिक न करने की कल्पना करें, क्योंकि आपको वह जानकारी मिली जो आप खोज परिणामों में सीधे खोज रहे थे - यह ऐसा नहीं है जो कि नहीं तालिका डेटा स्कैन करने की आवश्यकता है। how MySQL uses indexes पर कुछ और जानकारी यहां दी गई है:

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

चयनkey_part3tbl_nameकहांkey_part1 = 1

+1

धन्यवाद डैनी, जिज्ञासा से बाहर कोई तरीका है जो मैं बता सकता हूं कि 'ग्रुप-बाय (स्कैनिंग) के लिए इंडेक्स का उपयोग करना' ग्रुप-बाय 'या' डिस्टिंट 'क्लॉज पर लागू होने वाली इंडेक्स को संदर्भित करता है? – user784637

+0

चूंकि 'DISTINCT' बस [ग्रुप बाय' का एक विशेष मामला है] (http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html), और चूंकि दोनों कॉलम आते हैं एक ही सारणी, एक ही सूचकांक, मैं ईमानदारी से यकीन नहीं कर रहा हूँ। –

0

आपने क्या आप ऑब्जेक्टिफ़ाई कर सकते हैं:

ऑब्जेक्टि ऑब्जेक्ट = ObjectifyService.begin(); क्वेरी क्वेरी = ofy.query (यहां क्लास name.class है)। फ़िल्टर ("तालिका में कॉलम नाम", जिस क्वेरी के लिए क्वेरी है) .list();

इससे पहले कि आपको ऑब्जेक्टिफ़ाई के लिए जार जोड़ने की आवश्यकता हो।

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