MySQL स्टेटस वैरिएबल Handler_read_rnd_next बहुत बढ़ रहा है


11

MYSQL की स्थिति में, हैंडलर_read_rnd_next मान बहुत अधिक है।

मुझे पता है कि, यह मूल्य तब बढ़ाया जाएगा जब कोई क्वेरी निष्पादित की जाती है जिसमें उचित अनुक्रमित नहीं है।

लेकिन, जब हम 'हैंडलर_ड्रेड_रंड_नेक्स्ट' जैसे शो स्टेटस को निष्पादित करते हैं, तब भी यह मान 2 से बढ़ रहा है।

इस स्थिति ध्वज के आधार पर, हम कुछ आँकड़ों की निगरानी कर रहे हैं।

इसलिए हर बार, यह आँकड़े गंभीर दिखाई दे रहे हैं।

क्या हम 'हैंडलर_्रेड_रंड_नेक्स्ट' की गिनती से इन 'शो' के निष्पादन को बाहर कर सकते हैं।

इसके लिए एक और उदाहरण,

10 पंक्तियों के साथ एक तालिका होती है, स्तंभ 'डेटा' पर तालिका को अनुक्रमित किया जाता है, और यदि हम निम्नलिखित क्वेरी को निष्पादित करते हैं:

select data from test where data = 'vwx' -> returns one row

और यदि हम 'हैंडलर_ड्रेड_रंड_नेक्स्ट' का मान चेक करते हैं, तो यह 7 से बढ़ गया।

उपरोक्त क्वेरी के लिए स्पष्टीकरण कमांड का परिणाम निम्नलिखित है:

explain select data from test where data = 'vwx';

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

1, 'SIMPLE', 'test', 'ref', 'data', 'data', '35', 'const', 1, 'Using where; Using index'

क्या इस मूल्य को प्रतिबंधित करने का कोई तरीका है, या क्या मुझे पता है कि यह मूल्य बहुत तेजी से क्यों बढ़ रहा है।


क्या यह वास्तव में प्रदर्शन की समस्या है?
एरॉन ब्राउन

कोई प्रदर्शन प्रभावित नहीं हो रहा है, लेकिन निगरानी उपकरण इस झंडे की जाँच कर रहा है और महत्वपूर्ण दिखा रहा है।
फणींद्र

यदि प्रदर्शन कोई समस्या नहीं है, तो इसके बजाय निगरानी उपकरण को ठीक करें।
एरॉन ब्राउन

मैंने अन्य उपकरणों के साथ (मोइनोग) की जाँच की थी, वहाँ भी यही मुद्दा था।
फणींद्र

तो क्या? यदि यह प्रदर्शन समस्या पैदा नहीं कर रहा है तो इसे अनदेखा करें। यह सिर्फ एक काउंटर है।
एरॉन ब्राउन

जवाबों:


5

सबसे पहले, हम Handler_read_rnd_next की परिभाषा को देखें।

हैंडलर_read_rnd_next पर MySQL प्रलेखन के अनुसार :

डेटा फ़ाइल में अगली पंक्ति को पढ़ने के लिए अनुरोधों की संख्या। यदि आप बहुत अधिक टेबल स्कैन कर रहे हैं तो यह मान अधिक है। आम तौर पर यह पता चलता है कि आपकी तालिकाओं को ठीक से अनुक्रमित नहीं किया गया है या आपके प्रश्नों को आपके द्वारा अनुक्रमित अनुक्रमों का लाभ लेने के लिए नहीं लिखा गया है।

अब, अपनी क्वेरी देखें:

select data from test where data = 'vwx';

आपने कहा कि तालिका में 10 पंक्तियाँ हैं। अंगूठे के एक नियम के रूप में, MySQL क्वेरी ऑप्टिमाइज़र एक इंडेक्स के उपयोग को खारिज कर देगा यदि उन पंक्तियों की संख्या की जांच की जानी चाहिए जो कि पंक्तियों की कुल संख्या का 5% है।

हम गणित करते हैं। 10 पंक्तियों का 5% 0.5 पंक्तियाँ हैं। भले ही आपके डेटा का पता लगाने के लिए पंक्तियों की संख्या 1 हो, यानी 0.5 से अधिक। पंक्तियों की इस निचली संख्या और उस सूचकांक नियम के आधार पर, जिसका मैंने अभी उल्लेख किया है, MySQL क्वेरी ऑप्टिमाइज़र हमेशा एक टेबल स्कैन करेगा।

चूंकि स्तंभ dataखुद को अनुक्रमित किया गया है, टेबल स्कैन के बजाय, mysql को एक सूचकांक स्कैन किया गया था।

यदि आप एक निश्चितता के लिए जानते हैं कि परीक्षण तालिका कभी नहीं बढ़ेगी, तो आप सभी अनुक्रमित को निकाल सकते हैं और टेबल स्कैन होने दे सकते हैं। हैंडलर की स्थिति के चर में वृद्धि को रोकना चाहिए।


हाय, उत्तर के लिए धन्यवाद। मैंने सूचकांक को हटाकर कोशिश की थी और क्वेरी को निष्पादित करके मूल्य की जांच की। लेकिन Handler_read_rnd_next का मूल्य 18 से बढ़ रहा है जो कि सूचकांक के साथ 7 से बढ़ रहा था। जिस तालिका का मैंने उल्लेख किया है वह निश्चित नहीं है। यह एक उदाहरण है, मैंने तालिका में 70 और पंक्तियों को सम्मिलित किया है, इसलिए कुल पंक्तियाँ 80 हैं और स्तंभ 'डेटा' पर सूचकांक के साथ उसी क्वेरी को निष्पादित किया जाता है जो अभी भी केवल एक पंक्ति लौटाता है। लेकिन फिर भी जब मैं 'हैंडलर_ड्रेड_रंड_नेक्स्ट' के मूल्य की जांच करता हूं, तो यह अभी भी 7 से बढ़ रहा है। क्या मैं इस कारण को जान सकता हूं कि यह ध्वज कैसे बढ़ जाता है और इसे कैसे प्रतिबंधित किया जाए।
फणींद्र

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

"अंगूठे के एक नियम के रूप में, MySQL क्वेरी ऑप्टिमाइज़र एक इंडेक्स के उपयोग को खारिज कर देगा यदि उन पंक्तियों की संख्या की जांच की जानी चाहिए जो कि पंक्तियों की कुल संख्या का 5% है।" - यह जानना बहुत मददगार है। क्या कोई आधिकारिक दस्तावेज है जो इसका समर्थन करता है? आपको बहुत - बहुत धन्यवाद!
इटोक्टोपस

2

MySQL का क्या संस्करण?

जिन कारणों से यह झंडा बढ़ता है, उन्हें यहां सबसे अच्छा दस्तावेज दिया गया है: http://www.mysqlperformanceblog.com/2010/06/15/what-does-handler_read_rnd-mean/

संक्षेप में, यह सिर्फ एक पूर्ण या आंशिक टेबल स्कैन के दौरान प्राप्त पंक्तियों की संख्या का काउंटर है।

अब, उसने कहा, मुझे एक अलग परिणाम मिल रहा है:

mysql> CREATE TABLE `test` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `data` varchar(255) NOT NULL,
    ->   PRIMARY KEY (`id`),
    ->   KEY `data` (`data`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.27 sec)

mysql> INSERT INTO test (data) VALUES ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('vwx');
Query OK, 10 rows affected (0.06 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> FLUSH STATUS;
Query OK, 0 rows affected (0.07 sec)

mysql> select data from test where data = 'vwx';
+------+
| data |
+------+
| vwx  |
+------+
1 row in set (0.04 sec)

mysql> SHOW SESSION STATUS LIKE 'Handler%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Handler_commit             | 1     |
| Handler_delete             | 0     |
| Handler_discover           | 0     |
| Handler_prepare            | 0     |
| Handler_read_first         | 0     |
| Handler_read_key           | 3     |
| Handler_read_last          | 0     |
| Handler_read_next          | 1     |
| Handler_read_prev          | 0     |
| Handler_read_rnd           | 0     |
| Handler_read_rnd_next      | 0     |
| Handler_rollback           | 0     |
| Handler_savepoint          | 0     |
| Handler_savepoint_rollback | 0     |
| Handler_update             | 0     |
| Handler_write              | 0     |
+----------------------------+-------+
16 rows in set (0.15 sec)

0

यदि "डेटा" कॉलम पर एक अद्वितीय / प्राथमिक सूचकांक है तो आप इस क्वेरी के लिए पहले ही अनुकूलन कर चुके हैं। मुझे नहीं लगता कि इस पर और अनुकूलन किया जा सकता है।

इसके अलावा आप यह सत्यापित कर सकते हैं कि क्या पूर्ण टेबल स्कैन किया गया है या नहीं?

SHOW STATUS like 'select_scan'; 
SELECT data from test where data='vmx';
SHOW STATUS like 'select_scan'; 

सुनिश्चित करें कि select_scan ने यह मूल्य नहीं बढ़ाया है, इस तरह आप जांच सकते हैं कि पूर्ण तालिका स्कैन किया गया है या नहीं, आपको एक क्वेरी को अनुकूलित करने का प्रयास करना चाहिए जो पूर्ण तालिका स्कैन नहीं करेगा।

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