2013-08-08 6 views
6

के संदर्भ में यह क्वेरी अनुकूलित कैसे की जा सकती है यह क्वेरी मुझे दिए गए :x, :y को कार्टेशियन निर्देशांक में सबसे नज़दीकी तत्व देनी चाहिए।निष्पादन गति

SELECT `type` 
FROM `mapgen_centers` 
ORDER BY SQRT(POW((:x - `x`), 2) + POW((:y - `y`), 2)) 
LIMIT 1 

यह वर्तमान में औसत जो ठीक है पर 0.002s लेता है, लेकिन मैं महसूस कर रही है इस बेहतर हो सकता है, खासकर इसलिए कि मैं वर्तमान में यह बहुत, बहुत बार और बार-बार आग, ताकि लिपि बवासीर के पूरे निष्पादन कई मिनटों के लिए।

कर सकते हैं (और अगर, कैसे) यह एक मानक MySQL स्थापना पर किसी भी तरह के माध्यम से अनुकूलित किया जाना उपलब्ध (प्रक्रियाओं, कार्यों, अनुक्रमित, विन्यास, ...)

+0

आप फॉर्मूला के परिणाम के साथ एक कॉलम जोड़ने पर विचार कर सकते हैं: 'एसक्यूआरटी (पाउ ((: एक्स - एक्स), 2) + पाउ ((: वाई - वाई), 2)) 'और – Stephan

+0

पर एक इंडेक्स जोड़ें लेकिन ': x',': y' प्रत्येक निष्पादन के साथ बदलें? यदि सूत्र पहले ज्ञात नहीं हैं तो मैं उस सूत्र के साथ कॉलम कैसे बना सकता हूं? –

+2

क्या आपको वास्तव में 'एसक्यूआरटी' का उपयोग करने की आवश्यकता है क्योंकि इसका उपयोग केवल सॉर्ट करने के लिए किया जाता है? ऐसा नहीं है कि जब (x'-x)^2 + (y'-y)^2 अधिक हो जाता है तो इसका वर्ग रूट भी अधिक हो जाता है? – iCantSeeSharp

उत्तर

1

उस वर्ग रूट को हटाने के अलावा, मुझे नहीं लगता कि यह बेहतर किया जा सकता है। आपको क्या जांचना चाहिए कि निष्पादन समय वास्तव में O(n) है, जो यह होना चाहिए क्योंकि आपको कम से कम एक बार सभी तत्वों के माध्यम से खोजना होगा। यह आपके डेटाबेस में टेबल आकार के साथ निष्पादन समय वृद्धि को जांचकर किया जा सकता है। तो अगर 100000 पंक्तियों की एक मेज पर यह 10 मिलीसेकंड लेता है, तो इसे 1000000 पंक्तियों की एक मेज पर केवल 100 मिलीसेकंड लेना चाहिए ...

2

आप दो अंक के बीच एक दूरी की गणना कर रहे हैं के बाद से , मुझे लगता है कि आप MySQL spatial data type का उपयोग कर सकते हैं तो SO question है जो आपकी मदद कर सकता है।

वैकल्पिक रूप से, जैसा कि उन्होंने उपरोक्त टिप्पणियों में कहा था, आप अपनी दूरी के पूर्व-गणना मूल्य द्वारा एक सूचकांक बना सकते हैं।

3

1. आप MySQL spatial extension का उपयोग कर सकते हैं।

2. एसक्यूआरटी फ़ंक्शन को दबाएं, क्योंकि ऑर्डर करते समय यह अनावश्यक है।

+0

1 के बजाय 1. एक्स या वाई अपडेट होने पर हर बार योग की गणना क्यों नहीं की जाती? – iCantSeeSharp

+0

@Souvlaki 'x' और' y' दो स्तंभ नाम होना चाहिए, इस प्रकार हम पूर्व-गणना नहीं कर सकते हैं। – adamsmith

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