2011-10-25 14 views
5

मूल रूप से हम माईस्कल्स प्रदर्शन से बहुत खुश हैं, इसी तरह के प्रश्न एक दूसरे भाग में पूर्ण हो जाते हैं। अब हमें इस क्वेरी के साथ समस्या का सामना करना पड़ रहा हैMySQL प्रदर्शन को कम कर सकता है?

SELECT dc.id,dmr.art_id 
FROM dmr 
JOIN dma ON dma.id = dmr.dml_id 
JOIN dc ON dc.id = dma.dc_id 
WHERE dmr.art_id = 2285 

5021 पंक्तियों को लाने में 50 सेकंड लगते हैं। एक लापता सूचकांक शायद इस तरह के मुद्दों के लिए सबसे आम कारण है। तो मैंने EXPLAIN द्वारा क्वेरी से पहले और यह क्वेरी प्लान प्राप्त किया जो दिखाता है कि केवल इंडेक्स का उपयोग अनुक्रमिक स्कैन नहीं किया जाता है।

टेबल डीएमआर और डीएमए में 3 मिलियन पंक्तियां हैं, डीसी में 6000 पंक्तियां हैं।

+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| id | select_type | table | type | possible_keys     | key   | key_len | ref    | rows | Extra  | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825,ix_art_ref | ix_art_ref  | 5  | const    | 5021 | Using where | 
| 1 | SIMPLE  | dma | eq_ref | PRIMARY,FK8C6E1445153BBDC9 | PRIMARY  | 8  | dev.dmr.dml_id  | 1 |    | 
| 1 | SIMPLE  | dc | eq_ref | PRIMARY      | PRIMARY  | 8  | dev.dma.dc_id  | 1 | Using index | 
+----+-------------+-------+--------+-------------------------------+----------------+---------+--------------------+------+-------------+ 

इस समस्या का कारण क्या हो सकता है?

MySQL संस्करण इंजन के रूप में InnoDB का उपयोग कर 5.5 है। (विंडोज़ पर केवल डिफ़ॉल्ट पैरामीटर)।

संपादित

जब मैं हटाने जहां खंड, mysql रिटर्न (विशाल) तुरंत सेट परिणाम। इस मामले में क्वेरी योजना की तरह दिखता है:

+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| id | select_type | table | type | possible_keys    | key    | key_len | ref  | rows | Extra     | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
| 1 | SIMPLE  | dc | index | PRIMARY     | FKAEB144C64FA71464 | 9  | NULL  | 4037 | Using index    | 
| 1 | SIMPLE  | dma | ref | PRIMARY,FK8C6E1445153BBDC9 | FK8C6E1445153BBDC9 | 9  | dev.dc.id | 263 | Using where; Using index | 
| 1 | SIMPLE  | dmr | ref | FKC33D5199F17E1825   | FKC33D5199F17E1825 | 9  | dev.dma.id | 1 | Using where    | 
+----+-------------+-------+-------+----------------------------+--------------------+---------+------------+------+--------------------------+ 
+0

आप हार्ड डिस्क द्वारा बाध्य I/O की सबसे अधिक संभावना है। 'Innodb_buffer_pool' आकार परिवर्तक को अपनी रैम का 70% बढ़ाएं। इस तरह कामकाजी डेटासेट का हिस्सा स्मृति में रखा जाएगा और लुकअप बहुत तेज होगा। –

+0

तालिका का विश्लेषण करने का प्रयास करें ... http: //dev.mysql.com/doc/refman/5.0/en/analyze-table.html –

+0

@Neville - मैंने पहले ही किया है, यह कहता है कि स्थिति ठीक है। – stacker

उत्तर

0

मैंने mysql 5.5.17 को पुनर्स्थापित करके समस्या हल की और सेटिंग 'डेवलपर मशीन' का उपयोग न करने का निर्णय लिया, मैंने 'सर्वर मशीन' के लिए डिफ़ॉल्ट सेटिंग्स का उपयोग किया। उसके बाद क्वेरी कुछ सेकंड (पहली बार) में की जाती है, बाद की क्वेरी बहुत बेहतर प्रदर्शन करती है।

मुझे लगता है कि डेवलपर मोड में mysql राम को बचाने के लिए कॉन्फ़िगर किया गया है और बड़ी तालिकाओं के लिए पर्याप्त अनुक्रमणिका पृष्ठों को बफर नहीं करता है।

(पुनः) विन्यास कर सकते हैं MYSQL_HOME/bin/MySQLInstanceConfig

enter image description here

पुराने और नए config फ़ाइलों की एक तुलना से पता चलता है कि इन मूल्यों विन्यास के दौरान बदल रहे थे के साथ पूरा द्वारा:

tmp_table_size=103M old 18M 
myisam_sort_buffer_size=205M old 35M 
key_buffer_size=175M old 25M 
innodb_additional_mem_pool_size=7M old 3499K 
innodb_additional_mem_pool_size=2M old 1M 
innodb_buffer_pool_size=339M old 47M 
+0

जैसा कि एक टिप्पणी में सुझाव दिया गया है, आपका 'innodb_buffer_pool' बढ़ गया है। आप my.cnf फ़ाइल को संपादित करके मैन्युअल रूप से ऐसा कर सकते हैं या GUI के उदाहरण गड़बड़ी को फिर से कॉन्फ़िगर कर सकते हैं। किसी भी तरह से, आपका कामकाजी डेटासेट अब स्मृति में रहता है। दूसरे शब्दों में - यह समय-समय पर धीमा हो सकता है। –

+0

@ एनबी। क्षमा करें मेरे बुरे, मुझे समझ में नहीं आया कि आप 'कामकाजी डेटासेट' से क्या मतलब रखते हैं। अब अगर आप अपनी टिप्पणी को उत्तर के रूप में पोस्ट करते हैं तो सब कुछ स्पष्ट है, मैं इसे स्वीकार करूंगा। मदद के लिये शुक्रिया। – stacker

+0

यह ठीक है, मैं प्रतिनिधि के लिए "शिकार" नहीं कर रहा हूं, आपका उत्तर और टिप्पणियां अगले व्यक्ति के लिए एक ही समस्या के साथ चीजों को स्पष्ट कर देगी :) –

1

हो सकता है कि टेबल बहुत खंडित कर रहे हैं और MySQL डिस्क भर में जाने के लिए उन 5021 पंक्तियों को लाने के लिए है?

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