2012-04-23 25 views
8

मैं folowwing SQL क्वेरीMySQL समूह द्वारा बहुत धीमी गति से

SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

क्वेरी 11,400,000 पंक्तियों पर मार डाला और बहुत धीमी गति से चलाता है। निष्पादित करने में 3 मिनट लगते हैं। यदि मैं समूह को भाग से हटा देता हूं, तो यह 1 सेकंड से नीचे चला जाता है। ऐसा क्यों है?

MySQL सर्वर संस्करण '5.0.21-समुदाय-NT'

Here is the table schema: 
CREATE TABLE `sales` (
    `ID` int(11) NOT NULL auto_increment, 
    `DocNo` int(11) default '0', 
    `CustomerID` int(11) default '0', 
    `OperatorID` int(11) default '0', 
    PRIMARY KEY (`ID`), 
    KEY `ID` (`ID`), 
    KEY `DocNo` (`DocNo`), 
    KEY `CustomerID` (`CustomerID`), 
    KEY `Date` (`Date`) 
) ENGINE=MyISAM AUTO_INCREMENT=14946509 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
+1

क्या आप तालिका स्कीमा पोस्ट कर सकते हैं (तालिका की स्क्रिप्ट बनाएं) –

+2

सुनिश्चित नहीं है कि आपने वास्तविक क्वेरी पोस्ट की है या नहीं। लेकिन इस सवाल में यदि ग्रुपिंग फ़ंक्शन नहीं हैं तो ग्रुप बाय 'की आवश्यकता क्या होगी? –

+0

अज़ीज़, मुझे ग्राहक आईडी – Treach

उत्तर

17

पर (तिथि, CustomerID) एक सूचकांक डाल प्रयास करें है। Group by optimization

आप इस प्रकार यदि आप EXPLAIN का उपयोग कैसे mysql परिणाम पैदा कर रहा है पता कर सकते हैं: - -:

EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

हो जाएगा ताकि

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

+1

किसी ऐसे व्यक्ति के रूप में जो ऑप्टिमाइज़िंग प्रश्नों और तालिकाओं का लटका पाने के लिए शुरू कर रहा है, यह छोटा नगेट अमूल्य था। धन्यवाद। –

+0

@ आर्थरगोल्डस्मिथ कोई चिंता नहीं :) – rgvcorley

0

क्या यह एक बहुत तेज़ नहीं होगा और इसे प्राप्त नहीं करेगा?

SELECT DISTINCT CustomerID FROM sales WHERE `Date` <= '2012-01-01' 

Date पर एक सूचकांक जगह निश्चित रूप से, सुनिश्चित करें। मुझे पूरी तरह से यकीन नहीं है लेकिन अनुक्रमण CustomerID भी मदद कर सकता है।

3

यह जानने के बिना कि आपकी तालिका स्कीमा कैसा दिखता है, यह निश्चित होना मुश्किल है, लेकिन अगर आप Date और CustomerID पर एकाधिक कॉलम इंडेक्स जोड़ते हैं तो यह संभवतः मदद करेगा। इससे MySQL को GROUP BY कथन के लिए पूर्ण तालिका स्कैन करने की परेशानी होगी। तो ALTER TABLE sales ADD INDEX (Date,CustomerID) आज़माएं।

1

यह एक कोशिश:

SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01' 
+1

mysql में विशिष्ट है http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html द्वारा समूह का एक विशेष मामला है – cproinger

1

मैं एक ही समस्या थी, मैं एक ही मिलान करने के लिए महत्वपूर्ण क्षेत्रों बदल गया है और इससे समस्या का समाधान। तालिकाओं में शामिल होने के लिए फ़ील्ड अलग कोलेट मूल्य था।

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