से 20 गुना धीमी है, मेरे पास टेबल नाम को छोड़कर एक ही संरचना के साथ 10 टेबल हैं।mysql संग्रहीत प्रक्रिया मानक क्वेरी
select * from table1 where (@param1 IS NULL OR [email protected])
UNION ALL
select * from table2 where (@param1 IS NULL OR [email protected])
UNION ALL
...
...
UNION ALL
select * from table10 where (@param1 IS NULL OR [email protected])
मैं निम्न पंक्ति के साथ एसपी बोल रहा हूँ:
call mySP('test') //it executes in 6,836s
तो मैं एक नया मानक क्वेरी विंडो खोली
मैं एक एसपी (संग्रहीत प्रक्रिया) निम्नलिखित के रूप में परिभाषित किया गया है। मैंने अभी उपरोक्त क्वेरी की प्रतिलिपि बनाई है। फिर 'param' के साथ @ param1 को बदल दिया।
यह 0,321s में निष्पादित और संग्रहीत प्रक्रिया से लगभग 20 गुना तेज है।
मैंने कैश किए जाने के परिणाम को रोकने के लिए बार-बार पैरामीटर मान बदल दिया। लेकिन इसने परिणाम नहीं बदला। एसपी समकक्ष मानक क्वेरी की तुलना में लगभग 20 गुना धीमी है।
क्या आप यह जानने में मेरी सहायता कर सकते हैं कि यह क्यों हो रहा है?
क्या किसी को भी इसी तरह के मुद्दों का सामना करना पड़ा?
मैं विंडोज सर्वर 2008 आर 2 64 बिट पर mySQL 5.0.51 का उपयोग कर रहा हूं।
संपादित करें: मैं परीक्षण के लिए Navicat का उपयोग कर रहा हूँ।
कोई भी विचार मेरे लिए सहायक होगा।
EDIT1:
मैं सिर्फ Barmar के जवाब के अनुसार कुछ परीक्षण किया है।
अंत में मैं एक सिर्फ एक पंक्ति के साथ नीचे की तरह एसपी को बदल दिया है:
SELECT * FROM table1 WHERE [email protected] AND [email protected]
तो सबसे पहले मैं standart क्वेरी
SELECT * FROM table1 WHERE col1='test' AND col2='test' //Executed in 0.020s
निष्पादित करने के बाद मैं अपने एसपी कहा जाता है:
CALL MySp('test','test') //Executed in 0.466s
तो मैंने पूरी तरह से खंड बदल दिया है लेकिन कुछ भी नहीं बदला है। और मैंने नेविचैट की बजाय mysql कमांड विंडो से sp को बुलाया। यह एक ही परिणाम दिया। मैं अभी भी इस पर अटक गया हूँ।
मेरी एसपी DDL:
CREATE DEFINER = `myDbName`@`%`
PROCEDURE `MySP` (param1 VARCHAR(100), param2 VARCHAR(100))
BEGIN
SELECT * FROM table1 WHERE col1=param1 AND col2=param2
END
और col1 और col2 अनुक्रमित संयुक्त है।
आप कह सकते हैं कि आप स्टैंड स्टैंड क्वेरी का उपयोग क्यों नहीं करते? मेरा सॉफ़्टवेयर डिज़ाइन इसके लिए उचित नहीं है। मुझे संग्रहीत प्रक्रिया का उपयोग करना होगा। तो यह समस्या मेरे लिए बेहद महत्वपूर्ण है।
EDIT2:
मैं मिल गया है क्वेरी प्रोफ़ाइल जानकारियां। एसपी प्रोफाइल जानकारी में "डेटा पंक्ति भेजने" के कारण बड़ा अंतर है। डेटा भाग भेजना क्वेरी निष्पादन समय के% 99 लेता है। मैं स्थानीय डेटाबेस सर्वर पर परीक्षण कर रहा हूं। मैं रिमोट कंप्यूटर से कनेक्ट नहीं कर रहा हूँ।
सपा प्रोफ़ाइल जानकारी
क्वेरी प्रोफ़ाइल जानकारी
मैं अपने एसपी में नीचे की तरह बल सूचकांक बयान कोशिश की है। लेकिन एक ही परिणाम।
SELECT * FROM table1 FORCE INDEX (col1_col2_combined_index) WHERE [email protected] AND [email protected]
मैंने नीचे की तरह sp को बदल दिया है।
id:1
select_type=SIMPLE
table:table1
type=ref
possible_keys:NULL
key:NULL
key_len:NULL
ref:NULL
rows:292004
Extra:Using where
तब मैं नीचे दिए गए क्वेरी निष्पादित:
EXPLAIN SELECT * FROM table1 FORCE INDEX (col1_col2_combined_index) WHERE col1=param1 AND col2=param2
यह इस परिणाम दे दी है।
EXPLAIN SELECT * FROM table1 WHERE col1='test' AND col2='test'
परिणाम है:
id:1
select_type=SIMPLE
table:table1
type=ref
possible_keys:col1_co2_combined_index
key:col1_co2_combined_index
key_len:76
ref:const,const
rows:292004
Extra:Using where
मैं सपा में बल सूचकांक कथन का उपयोग कर रहा हूँ। लेकिन यह सूचकांक का उपयोग नहीं करने पर जोर देता है। कोई उपाय? मुझे लगता है कि मैं पास हूँ समाप्त करने के लिए :)
यह हो सकता है कि एसपी को निष्पादित करने के बाद, MySQL ने परिणाम कैश किया है, और फिर जब आप इसे एसपी के बाहर निष्पादित करते हैं, तो यह फिर से इसे निष्पादित करने के बजाय कैश को मार रहा है। –
वैसे, एक ही संरचना के साथ 10 टेबल क्यों? उन्हें 1 टेबल में क्यों न मिलाएं? –
डेटाबेस डिज़ाइन मेरे हाथ से बाहर है मैं कभी ऐसा डिज़ाइन नहीं करूंगा :) पहले मैं अलग पैरामीटर के साथ क्वेरी निष्पादित करता हूं, फिर तुरंत मैं उसी पैरामीटर के साथ स्पैम को कॉल करता हूं। नतीजा ऐसा लगता है कि एसपी ने भी कैश से परिणाम नहीं लिया। – bselvan