2010-04-29 13 views
21

अफवाह यह है कि इस:प्रदर्शन प्रश्नों

SELECT * FROM lineage_string where lineage regexp '(^|/)179(/|$)' 

किसी को भी इस बात की पुष्टि कर सकते हैं:

SELECT * FROM lineage_string where lineage like '%179%' and lineage regexp '(^|/)179(/|$)' 

इस से भी तेज होगा? या ऐसे प्रश्नों की गति का परीक्षण करने के लिए एक सभ्य तरीका पता है। धन्यवाद

+0

इस खराब समर्थित ब्लॉग पोस्ट के अनुसार, LIKE REGEXP से 10x तेज था (डेटा भिन्न हो सकता है, इंडेक्स उपयोग पर कोई शब्द नहीं है): http://thingsilearn.wordpress.com/2008/02/28/mysql-query -स्पीड-रेगेक्सपी-बनाम-जैसे/ –

+0

अतिरिक्त लिंक - एक ही कहानी, जैसे तेज़ है: http://lists.mysql.com/mysql/101728 –

+0

यह 'टेक्स्ट' और 'वचर' फ़ील्ड के लिए निश्चित रूप से तेज़ था, मैंने कोशिश की पर। मुझे याद है कि एक ब्लॉग टिप्पणी में पढ़ना है कि ** REGEXP ** 'UNSIGNED' फ़ील्ड के लिए ** LIKE ** से तेज़ है, लेकिन मैं इसकी पुष्टि नहीं कर सकता। – inhan

उत्तर

21

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

एक भी बड़ा speedup यदि आप कुछ इस तरह है देखा जा सकता है:

SELECT * FROM (
    SELECT * FROM lineage_string 
    WHERE lineage LIKE '179%' 
) WHERE lineage regexp '^179(/|$)' 

अब एक सूचकांक संभावना पंक्तियों को खोजने के लिए है क्योंकि जैसे '179%' sargable है इस्तेमाल किया जा सकता। कई पंक्तियों की जांच करने की आवश्यकता नहीं होगी।

हमेशा सुनिश्चित करने का सबसे अच्छा तरीका यह है कि इसे अपने वास्तविक डेटा पर स्वयं के लिए मापें।

13

हाँ, यह शायद थोड़ा सा तेज़ होगा क्योंकि मानक-एसक्यूएल LIKE पूर्ण-ऑन रेगेक्स पार्सर की तुलना में एक सरल तुलना ऑपरेशन है।

हालांकि, वास्तविक शब्दों में दोनों वास्तव में धीमी हैं, क्योंकि न तो सूचकांक का उपयोग कर सकते हैं। (LIKE एक सूचकांक उपयोग कर सकते हैं मैच स्ट्रिंग वाइल्डकार्ड के साथ शुरू नहीं करता है, लेकिन स्थिति यहाँ नहीं है।)

आप गति के बारे में चिंतित हैं, तो आप अपने स्कीमा बदलना चाहिए ताकि आप 179 सीधे डाल सकते हैं प्रत्येक पंक्ति पर मैन्युअल रूप से स्ट्रिंग के माध्यम से जांचने के बजाय, कॉलम और इंडेक्स में।

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