अगर आपको रेगेक्सपी-शैली WHERE
. का उपयोग करना चाहिए खंड, आप निश्चित रूप से धीमी-क्वेरी समस्याओं से ग्रस्त होंगे। काम करने के लिए रेगेक्सपी-शैली की खोज के लिए, MySQL को आपके नाम कॉलम के प्रत्येक मान की तुलना regexp से करनी होगी। और, आपके उपयोगकर्ता नाम कॉलम को देखकर आपकी क्वेरी ने परेशानी को दोगुना कर दिया है।
इसका मतलब है कि MySQL किसी भी इंडेक्स का लाभ नहीं उठा सकता है, इस तरह सभी डीबीएमएस बड़े टेबल के प्रश्नों को गति देते हैं।
कुछ चीजें हैं जिन्हें आप आजमा सकते हैं। उन सभी में REGEXP को अलविदा कहना शामिल है।
एक यह है:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
यदि आप अपने नाम और उपयोगकर्ता नाम कॉलम पर अनुक्रमणिका बनाते हैं तो यह शालीनता से तेज़ होना चाहिए। यह 'जैक' से शुरू होने वाले सभी नामों/उपयोगकर्ता नामों की तलाश करेगा। ध्यान दें कि
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
'जैक' के साथ समाप्त होने वाले नामों की तलाश करेगा लेकिन आपकी रेगेक्सपी-शैली की खोज की तरह धीमी होगी।
एक और चीज जो आप कर सकते हैं वह यह पता लगाना है कि आपके एप्लिकेशन को किसी नाम या उपयोगकर्ता नाम के हिस्से की खोज करने में सक्षम होने की आवश्यकता क्यों है। आप या तो अपने एप्लिकेशन से इस सुविधा को समाप्त कर सकते हैं, या इसे संभालने का कोई बेहतर तरीका निकाल सकते हैं।
संभावित बेहतर तरीके:
- अपने उपयोगकर्ताओं से उनके नामों को दिए गए नाम और उपनाम फ़ील्ड में विभाजित करने और अलग से खोजने के लिए कहें।
- एक अलग "सभी उपयोगकर्ताओं को खोजें" सुविधा बनाएं जिसका उपयोग केवल तब किया जाता है जब उपयोगकर्ता को इसकी आवश्यकता होती है, जिससे आपकी धीमी रेगेक्सपी-शैली क्वेरी की आवृत्ति कम हो जाती है।
- किसी प्रकार के प्रीप्रोसेसिंग प्रोग्राम का उपयोग करके स्वयं उनके नामों को एक अलग नाम-शब्द तालिका में विभाजित करें। regexp के बिना नाम-शब्द तालिका खोजें।
- इस सुविधा के लिए MySQL पूर्ण पाठ खोज का उपयोग करने का तरीका जानें।
इन सभी में कुछ प्रोग्रामिंग कार्य शामिल हैं।