इष्टतम Sort_buffer_size कैसे निर्धारित करें?


10

मैं एक नमूना विन्यास फाइल से पढ़ता हूं जो निम्नलिखित कहती है:

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

मेरे पास कुछ क्वेरीज़ हैं, जो फ़ाइलसॉर्ट का उपयोग करती हैं। मैं यह कैसे निर्धारित करूं कि डिस्क को सुचारू रूप से चलाने के लिए प्रश्नों के लिए मुझे जिस बफर की आवश्यकता है उसका आकार क्या है?


क्या आपने mysqltuner या ट्यूनिंग-प्राइमर चलाया है आप इन ऐप्स में अपने my.cnf के बारे में कुछ दिलचस्प देख सकते हैं।
डेविड मार्टिनेज

जवाबों:


14

केवल एक स्थिति चर है जो Sort_buffer_size की परवाह करता है । यह आपके पास वापस संदेश में प्रश्न में है: Sort_merge_passes । MySQL प्रलेखन कहते हैं:

Sort_merge_passes: मर्ज की संख्या उस तरह के एल्गोरिथ्म से गुजरती है जिसे करना है। यदि यह मान बड़ा है, तो आपको सॉर्ट_बफ़र_साइज़ सिस्टम वैरिएबल का मान बढ़ाने पर विचार करना चाहिए ।

कृपया Sort_buffer_size के बारे में एक बात का ध्यान रखें

यदि आप SHOW GLOBAL STATUS आउटपुट में प्रति सेकंड कई Sort_merge_passes देखते हैं, तो आप ORDER BY या ग्रुप द्वारा गति बढ़ाने के लिए Sort_buffer_size मान बढ़ाने पर विचार कर सकते हैं जो क्वेरी अनुकूलन या बेहतर अनुक्रमण के साथ सुधार नहीं किया जा सकता।

sort_buffer_sizeसवाल उठाते समय आप GROUP BYs और ORDER BYs के साथ क्वेरीज़ की मदद कर सकते हैं , आप क्वेरी को बेहतर बनाने में सुधार कर सकते हैं और ऐसे सूचकांक जोड़ सकते हैं जो क्वेरी ऑप्टिमाइज़र द्वारा उपयोग किए जा सकते हैं।

प्रश्न शेष है: आप Sort_merge_passes की जांच कैसे करते हैं ???

अंतिम 5 मिनट में कितने Sort_merge_passes हुए, यह जांचने के लिए इस कोड का उपयोग करें। यह प्रति घंटे Sort_merge_passes की गणना भी करता है।

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

यदि आपको Sort_merge_passes और दर बहुत अधिक है, तो क्रमबद्ध_बर्फर_साइज़ बढ़ाने के लिए स्वतंत्र महसूस करें । मान लीजिए आप 4M तक उठाना चाहते हैं। आप इसे चलाएंगे:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

फिर आप इसे my.cnf में जोड़ देंगे

[mysqld]
sort_buffer_size = 4M

आप दूसरी बार Sort_merge_passes spikes की जांच करने के लिए समय-समय पर कोड चलाएंगे


2
यह बहुत बेहतर उत्तर है
ग्रेग

7
@RolanoMySQLDBA आप निम्न में "कई" को परिभाषित कर सकते हैं: "यदि आप प्रति सेकंड कई Sort_merge_passes देखें"
Tarek

2

आपको डिफ़ॉल्ट से Sort_buffer_size को बदलने की आवश्यकता नहीं है। आप गलतफहमी यह सवाल के आधार पर उपयोग करते हैं। आपको SQL की जाँच करके यह देखना चाहिए कि क्या आप इसे ट्यून करने में सक्षम हैं और किसी इंडेक्स का उपयोग करके ORDER BY / GROUP BY शर्तों को संतुष्ट कर सकते हैं। यह आम तौर पर एक समग्र सूचकांक होगा।

आगे: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


यह कहने के लिए क्षमा करें कि मुझे वह पोस्ट शायद ही उपयोगी लगी हो। यह लोगों को सिर्फ कुछ नहीं करने के लिए कहने के कारण है क्योंकि आप विशेषज्ञ नहीं हैं। जैसा कि पहले टिप्पणीकार ने बताया है, .cnfmysql के साथ भेजी गई नमूना फाइलें डिफ़ॉल्ट सेटिंग का उपयोग नहीं करती हैं।
प्रश्न ओवरफ्लो

यदि आप इसे फिर से पढ़ते हैं, तो यह भी कहता है कि विशेषज्ञ पहले से ही डिफ़ॉल्ट से मूल्य नहीं बदलना जानता है। नमूना .cnf फ़ाइलों को अच्छी प्रथा के रूप में इस्तेमाल या संदर्भित नहीं किया जाना चाहिए। अगर आपको my.cnf फाइल बनाने में मदद की जरूरत है, तो पेरकोना काफी गहन विज़ार्ड की पेशकश करती है। tools.percona.com/wizard
eroomydna

2

मैनुअल में मार्गदर्शन (5.0-5.5) है

यदि आप SHOW GLOBAL STATUS आउटपुट में प्रति सेकंड कई Sort_merge_passes देखते हैं, तो आप क्वेरी अनुकूलन या बेहतर अनुक्रमण के साथ सुधार नहीं किए जा सकने वाले ORDER BY या GROUP द्वारा गति बढ़ाने के लिए Sort_buffer_size मान बढ़ाने पर विचार कर सकते हैं। पूरे बफर को आवंटित किया जाता है, भले ही यह सभी की आवश्यकता न हो, इसलिए इसे विश्व स्तर पर आवश्यकता से अधिक सेट करना अधिकांश प्रश्नों को धीमा कर देगा। सत्र सेटिंग के रूप में इसे बढ़ाना सबसे अच्छा है, और केवल उन सत्रों के लिए जिन्हें बड़े आकार की आवश्यकता है। लिनक्स पर, 256KB और 2MB के थ्रेसहोल्ड हैं जहां बड़े मान मेमोरी आवंटन को काफी धीमा कर सकते हैं, इसलिए आपको उन मूल्यों में से एक के नीचे रहने पर विचार करना चाहिए। अपने वर्कलोड के लिए सबसे अच्छा मूल्य खोजने के लिए प्रयोग।

5.6 के बाद से वर्डिंग इंगित करता है कि ऑप्टिमाइज़र क्वेरी के लिए मान ले सकता है और सर्वर बफर को सीमा तक बढ़ा सकता है। इससे मान सेट करने की लागत बहुत अधिक हो जाती है। तो ऐसा लगता है कि आप रूढ़िवादी होना चाहते हैं, तो 5.6.4 से कम की रिलीज़ के लिए डिफ़ॉल्ट (जैसा कि रिलीज़ cnf फ़ाइलें करते हैं) से कम है, लेकिन डिफ़ॉल्ट 2MB या इससे भी अधिक, 5.6 से कहने के लिए उच्च सीमा हो सकती है। 4 के रूप में पूरी राशि नेत्रहीन आवंटित नहीं है।

MySQL 5.6.4 के रूप में, ऑप्टिमाइज़र यह पता लगाने की कोशिश करता है कि कितनी जगह की आवश्यकता है लेकिन सीमा तक अधिक आवंटित कर सकते हैं।


1

इष्टतम निर्धारित करने का सबसे अच्छा तरीका sort_buffer_sizeइसे बेंचमार्क करना है।

कैसे? जैसे @RolandoMySQLDBA ने कहा कि जाँच Sort_merge_passesसहायक हो सकती है, लेकिन यह एकमात्र कारक नहीं है जो प्रदर्शन को प्रभावित करता है। जब आप वृद्धि करते हैं तो आपको सावधान रहना चाहिए sort_buffer_size

दस्तावेज़ कहता है कि

लिनक्स पर, 256KB और 2MB के थ्रेसहोल्ड हैं जहां बड़े मान मेमोरी आवंटन को काफी धीमा कर सकते हैं, इसलिए आपको उन मूल्यों में से एक के नीचे रहने पर विचार करना चाहिए।

नहीं है एक पोस्ट परीक्षण है कि निष्कर्ष निकाला है के बारे में

sort_merge_passesयह बुरा नहीं है। अपना sort_buffer_sizeबड़ा पर्याप्त सेट करना शून्य है इसलिए sort_merge_passesइष्टतम नहीं हो सकता है।

जब मैंने परीक्षण किया, तो मुझे भी इसी तरह का परिणाम मिला।

आदर्श रूप से, उस स्थिति से बचना सबसे अच्छा होगा जिसे आपको अनुकूलित करने की आवश्यकता है sort_buffer_size। कैसे? ऑप्टिमाइज़ेशन दस्तावेज़ का यह आदेश आपको यह समझने में मदद कर सकता है कि हुड के तहत चीजें कैसे काम करती हैं।


-1

"mysql> सेट ग्लोबल सॉर्ट_बफ़र_साइज़ = 1024 * 1024 * 4;" इसका बुरा तरीका 4m सॉर्ट बफर साइज़ में डालना है, इससे सॉर्ट बफर साइज़ 4GB है

"mysql> सेट ग्लोबल सॉर्ट_बफ़र_साइज़ = 1024 * 4;"

अगर मैं आपका रहा हूं, तो मैं छोटे बफर आकार को बदलने की कोशिश नहीं करता, जो आपके सर्वर को क्रैश करने का एक अच्छा तरीका है, और ट्रैश प्रदर्शन को भेजें। बेहतर है कि बेहतर क्वेरी बनाने की कोशिश करें।


1
4K सॉर्ट बफर में कोई भी बड़ी छंटनी कैसे हो सकती है? ध्यान दें कि आपने कहा था 1024 * 4। वह 4096, 4K है।
रोलैंडमाइसीडीडीबीए

रोलांडो ने ^ ^ क्या कहा। और न्यूनतम अनुमत मूल्य 32K है।
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.