2013-07-09 7 views
5

में काम करता है मैं mysql डेटाबेस जो केवल एक टेबल है का उपयोग कर रहा "डाटा"17,151257 rows.This मेज के साथ एक स्तंभ स्ट्रिंग है। मैं सभी पंक्तियों जिसमें स्ट्रिंग कॉलम किसी विशेष क्वेरी स्ट्रिंग ("entered_query" चर में संग्रहीत) शामिल हैं प्रिंट करना चाहते हैं, तो मैं निम्नलिखित प्रयोग किया है:mysql का चयन क्वेरी अनुकूलन और कैसे सीमा mysql

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

के रूप में क्वेरी ऊपर स्पष्ट बहुत ज्यादा समय ले जा रहा है निष्पादित करने के लिए ।

मैंने पढ़ा है कि अनुक्रमण का उपयोग किया जा सकता है लेकिन इस मामले में कैसे?
मैंने पूरे डेटा को 10 अलग-अलग पंक्तियों में विभाजित करने और फिर
perl डीबीआई का उपयोग करके 10 समांतर प्रश्नों को निष्पादित करने का भी सोचा है।

अब मैं निम्नलिखित है प्रश्न:

  1. कैसे निष्पादन समय को कम करने के लिए?
  2. मैंने सुना है कि mysql क्वेरी में "पसंद" इंडेक्सिंग से बचाता है तो क्या उपरोक्त क्वेरी के लिए कोई बेहतर विकल्प है?
  3. जब हम mysql क्वेरी में सीमा 10 का उपयोग तो mysql के रूप में यह पहले 10 परिणाम पाता है या पहले इसे किसी क्वेरी के लिए पूरे डेटा तो यह पहले 10 परिणाम
+0

मुझे आशा है कि '$ enter_query' में इसका नाम काफी कुछ नहीं है। अन्यथा यह आपके प्रश्नों को तेज़ करने का एक तरीका हो सकता है जो आप नहीं चाहते हैं। – innaM

+0

'DISTINCT *' क्या करना है और क्या आपके दर्ज स्ट्रिंग के आकार की निचली सीमा है? – innaM

+0

@innaM DISTINCT * का उपयोग केवल अद्वितीय टुपल का चयन करने के लिए किया जाता है। $ enter_query में क्वेरी है जो उपयोगकर्ताओं द्वारा "स्ट्रिंग" कॉलम ओडी टेबल "डेटा" में खोजने के लिए दर्ज की जाती है। * भ्रमित उदाहरण चुनने के लिए खेद है। –

उत्तर

7

नियमित अनुक्रमण कर सकते हैं रिटर्न खोज के रूप में जल्द क्रियान्वित बंद हो जाता है करता है उस क्वेरी को बेहतर बनाने के लिए इस्तेमाल नहीं किया जाएगा। MySQL अनुक्रमणिका बी-पेड़ हैं, जिसका अर्थ है कि वे अनुक्रमित कॉलम का उपसर्ग बहुत जल्दी पा सकते हैं। लेकिन चूंकि आपकी LIKE क्वेरी में शुरुआत में % है, इसलिए खोज करने के लिए कोई अनन्य उपसर्ग नहीं है। इसलिए पैटर्न के खिलाफ मिलान करने के लिए हर पंक्ति को स्कैन किया जाना चाहिए।

हालांकि, MySQL पूर्ण-पाठ खोज का भी समर्थन करता है। यह कॉलम में सभी शब्दों का एक सूचकांक बनाता है, और यह इन शब्दों को जल्दी से पा सकता है। विवरण के लिए documentation देखें।

यदि आप LIMIT 10 का उपयोग करते हैं, तो यह शर्तों को पूरा करने वाली पहली 10 पंक्तियों को जल्द ही स्कैनिंग रोक देगा। जब तक आप ORDER BY का उपयोग नहीं करते हैं - तो उसे सभी पंक्तियों को ढूंढना होगा ताकि यह पहले 10 का चयन करने से पहले उन्हें सॉर्ट कर सके।

+0

धन्यवाद .... क्या कोई भी परिणाम बिना किसी प्रयोग के प्राप्त करने के लिए है? और पूरे डेटा को 10 अलग-अलग पंक्तियों में विभाजित करने और फिर डीएलबी डीबीआई का उपयोग करके 10 समांतर प्रश्नों को निष्पादित करने के बारे में क्या है। –

+0

मैंने आपको बताया कि LIKE का उपयोग किये बिना इसे कैसे करें, पूर्ण-पाठ खोज का उपयोग करें। अलग-अलग प्रश्नों में इसे विभाजित करने से मदद मिल सकती है, यह इस बात पर निर्भर करता है कि आपके पास डेटाबेस सर्वर पर कितने कोर हैं। लेकिन बाधा डिस्क होने की संभावना है, इसलिए यह बहुत ज्यादा मदद नहीं करेगा। – Barmar

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