sql - MySQL query not using index correctly? -


मेरे पास 2 तालिकाओं हैं - प्रोफ़ाइल के साथ 1,500,000 रिकॉर्ड और indicator_trades के साथ 12,000,000 रिकॉर्ड निम्न क्वेरी, जो 0 परिणाम देता है, को पूरा करने में लगभग 10 सेकंड लगते हैं।

  SELECT `trd`।` `` `` `` `` `` `` `` `` `` INNER JOIN 'प्रोफ़ाइल' ए एस `पी` पर `पी`` `` `` `` `` `` `` `` `` `` `` <`` `` `` \ "\" और < / कोड>  

DESCRIBE परिणाम:

  + ---- + ------------- + ------- + -------- + ----------------------- + ------------ + --- ------ + -------------------------- + ------ + --------- ---- + | आईडी | select_type | टेबल | प्रकार | संभव_कीज | कुंजी | Key_len | रेफरी | पंक्तियाँ | अतिरिक्त | + ---- + ------------- + ------- + -------- + ------------- ---------- + ------------ + --------- + ---------------- ---------- + ------ + ------------- + | 1 | सरल | Trd | श्रेणी | IDX_symbol, start_date | Start_date | 4 | नल | 3662 | जहां का उपयोग करना | | 1 | सरल | पी | Eq_ref | IDX_symbol, type | IDX_symbol | 34 | Barchart_data.trd.symbol | 1 | जहां का उपयोग करना | + ---- + ------------- + ------- + -------- + ------------- ---------- + ------------ + --------- + ---------------- ---------- + ------ + ------------- +   

10 सेकंड एक असामान्य रूप से लंबा लगता है इस क्वेरी के लिए समय जब यह कुंजी का उपयोग कर रहा है, लेकिन क्या यह केवल indicator_trades तालिका में 12,000,000 से 3662 रिकॉर्ड्स को पारे जाने के लिए उस समय लेता है?

दो तालिकाओं पर बनाएं:

  टेबल `indicator_trades` (` id` bigint (20) अहस्ताक्षरित नहीं NULL AUTO_INCREMENT, `symbol` varchar (32) नहीं NULL,` indicator_code` varchar (10) नहीं NULL, बनाएँ `प्रारंभ_तिथि `तारीख डिफ़ॉल्ट शून्य,` last_update` टाइमस्टैम्प अद्यतन CURRENT_TIMESTAMP, प्राथमिक कुंजी ( `id`), कुंजी` IDX_symbol` ( `symbol`) पर नहीं NULL डिफ़ॉल्ट CURRENT_TIMESTAMP BTREE का उपयोग, कुंजी` start_date` ( `start_date`), कुंजी` indicator_code `(` सूचककोड`)) इंजन = इंनोडीबी आउटऑन्ग्रेमेंट = 12582721 DEFAULT CHARSET = latin1 ROW_FORMAT = कॉम्पेक्ट | टेबल `profile` (` id` bigint (20) अहस्ताक्षरित नहीं NULL AUTO_INCREMENT, `symbol` varchar (32) नहीं NULL,` type` पूर्णांक (11) डिफ़ॉल्ट शून्य, `lastupdate` datetime नहीं NULL डिफ़ॉल्ट 'बनाने 0000-00- 00 00:00:00 ', प्राथमिक कुंजी ( `id`), अद्वितीय कुंजी` IDX_symbol` ( `symbol`) BTREE, कुंजी` type` ( `type`), कुंजी` exchange` का उपयोग ( `exchange`)) इंजन = InnoDB AUTO_INCREMENT = 320948248 डिफ़ॉल्ट charset = latin1    

एक सबसे पहले आपकी क्वेरी देखने होना चाहिए तेज, यह भी एक्सप्लेन आउटपुट द्वारा वर्णित है।

आप डिस्क रीड से नहीं बचा सकते क्योंकि आपको उस क्षेत्र को प्राप्त करने की ज़रूरत है जो कि इंडेक्स में उपयोग नहीं की गई है (जैसे: सूचकांक start_date का उपयोग करके, लेकिन रीड चिन्ह की आवश्यकता है फ़ील्ड; प्रतीक सूचकांक का उपयोग कर पढ़ना प्रकार फ़ील्ड)।

इसके अलावा आपको यह सुनिश्चित करने की ज़रूरत है कि सभी इंडेक्स मेमोरी में लोड किए गए हैं (बफ़र_पूल सेटिंग आपको इसे बढ़ाने की अनुमति देता है)।

आपकी क्वेरी को इस तरह फिर से लिखा जा सकता है (मुझे लगता है कि वही प्रदर्शन अपेक्षित होना चाहिए):

  SELECT `p`। `` p` में p`.`symbol` (जहां `का चयन करें DISTINCT (` trd`.`symbol`) `से indicator_trades`` trd` जहां `trd`.`start_date` & gt रूप profile`; = '2014- 09-17 ') और `p`। टाइप करें = 2   

लेकिन आप उप-क्वेरी चला सकते हैं और हमें बताएं कि इसके लिए गति क्या है: < पूर्व> SELECT DISTINCT (`trd`` `` `` `` `` `` `)" से `सूचक 'ट्रेडमार्क` `trd` WHERE` trd`.`start_date` & gt; =' 2014-09-17 '

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -