2011-05-05 16 views
9

नीचे एक प्रश्न मैं ईमेल द्वारा एक व्यक्ति को खोज के लिए उपयोग करते हैंMysql के साथ वाइल्डकार्ड (%%) खोजें प्रदर्शन

SELECT * 
    FROM phppos_customers 
    JOIN phppos_people ON phppos_customers.person_id = phppos_people.person_id 
    WHERE deleted = 0 
    AND email LIKE '%f%' 
ORDER BY email ASC 

क्वेरी "ईमेल" गति पर एक सूचकांक जोड़ने जाएगा सुधारें?

+0

[कि explaination] (http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning) को समझने के लिए क्यों यह काम नहीं कर रहा मदद कर सकता है। –

+1

[** यह उत्तर **] (http://stackoverflow.com/a/22531268/793309) एक अच्छी तकनीक दिखाता है - सभी प्रत्यय अनुक्रमणित करना - जो इस प्रकार की क्वेरी को बहुत अच्छी तरह से कर सकता है, लेकिन कुछ की कीमत पर अतिरिक्त कोडिंग और अधिक भंडारण आवश्यकताओं। – antinome

उत्तर

14

नहीं, क्योंकि MySQL आप एक प्रमुख वाइल्डकार्ड है जब सूचकांक का उपयोग करने में सक्षम नहीं होगा। यदि आपने अपना LIKE 'f%' में बदल दिया है, तो यह अनुक्रमणिका का उपयोग करने में सक्षम होगा।

8

नहीं है, Mysql सूचकांक का उपयोग नहीं होगा क्योंकि LIKE तर्क (%f%) वाइल्डकार्ड वर्ण % साथ शुरू होता है। यदि यह स्थिर के साथ शुरू होता है, तो अनुक्रमणिका का उपयोग किया जाएगा।

और जानकारी: 7.5.3. How MySQL Uses Indexes

1

आप LIKE के साथ इसे तेजी से बनाने में सक्षम नहीं होंगे जैसा कि सभी कहते हैं (शुरुआत में % के बारे में), लेकिन आप अपने लोगों को पहले फ़िल्टर करने के बाद इसमें शामिल होने से थोड़ा सुधार कर सकते हैं।

SELECT * 
    FROM (SELECT * 
      FROM `phppos_customers` 
     WHERE `deleted` = 0 
      AND `email` LIKE '%f%') `t_customers` 
    JOIN `phppos_people` ON `t_customers`.`person_id`=`phppos_people`.`person_id` 
ORDER BY `email` asc 
+0

व्युत्पन्न तालिका/इनलाइन व्यू में बाईं तरफ वाइल्डकार्ड के साथ 'LIKE' का उपयोग करना अभी भी एक इंडेक्स का उपयोग नहीं करेगा ... –

+0

मैंने कभी नहीं कहा कि यह ... –

+0

ओपी विशेष रूप से इंडेक्स उपयोग के बारे में पूछता है ... मैं' एम डाउनवोट करने के इच्छुक हैं, क्योंकि आप जानते हैं कि आप प्रश्न के मूल्य के कुछ भी प्रदान नहीं करते हैं ... –

4

एक LIKE आपरेशन के बाईं ओर Wildcarding सुनिश्चित करता है कि एक सूचकांक है, अगर एक email स्तंभ पर मौजूद है, नहीं किया जा सकता।

पूर्ण पाठ खोज (FTS) एसक्यूएल के माध्यम से पाठ के भीतर तार को खोजने के लिए वाक्य रचना पसंद किया जाता है। MySQL has native FTS functionality, using the MATCH/AGAINST syntax (Requires the table to use the MyISAM engine for v.5.5 and below. InnoDB FTS supported on v.5.6+):

SELECT c.*, p.* 
    FROM PHPPOS_CUSTOMERS c 
    JOIN PHPPOS_PEOPLE p ON p.person_id = c..person_id 
    WHERE deleted = 0 
    AND MATCH(email) AGAINST('f') 
ORDER BY email 

लेकिन इस तरह के स्फिंक्स के रूप में तीसरे पक्ष के FTS प्रौद्योगिकी, देखते हैं।

+0

मैं प्रतिलिपि प्राप्त विस्तृत और यहाँ Sphynx के बारे में थोड़ा बात की: http://stackoverflow.com/questions/3338889/how-to-find-similar-results-and-sort-by-similarity/3339034#3339034 –

+0

MySQL के रूप में 5.6 एफटीएस कार्यक्षमता अब InnoDB तालिकाओं पर उपलब्ध है। – blo0p3r

3

मेरी पोस्ट यहाँ मैं का वर्णन है, विस्तार से, एक तकनीक है कि कुछ अतिरिक्त भंडारण की कीमत पर, करने की अनुमति देता तेज %infix% खोज के लिए LIKE साथ सूचकांक का उपयोग करें:

https://stackoverflow.com/a/22531268/543814

जब तक तार अपेक्षाकृत छोटे होते हैं, भंडारण आवश्यकता आमतौर पर स्वीकार्य होती है।

गूगल के अनुसार, औसत ई-मेल एड्रेस 25 वर्ण लंबा है। यह औसतन 12.5 पर आपके आवश्यक भंडारण को बढ़ाता है, और आपको बदले में तेजी से अनुक्रमित खोज देता है। मेरे दृष्टिकोण से (गणना के लिए मेरी पोस्ट देखें।)

, यदि आप 10'000 ई-मेल पतों भंडारण कर रहे हैं, आप ठीक भंडारण (के समकक्ष) 100'000 ई-मेल पतों के बारे में भी होना चाहिए। यदि यह एक सूचकांक का उपयोग करने की अनुमति देने के लिए होता है, जो एक स्वीकार्य व्यापार-बंद की तरह लगता है। अक्सर, डिस्क स्थान सस्ता है, जबकि गैर अनुक्रमित खोज अनावश्यक हैं।

आप इस दृष्टिकोण लेने के लिए चुनते हैं, तो मेरा सुझाव है कि आप 64 वर्णों के लिए ई-मेल पतों के इनपुट लंबाई की सीमा। ऐसी लंबाई के उन दुर्लभ (या हमलावर) ई-मेल पते को सामान्य भंडारण 32 तक की आवश्यकता होगी। यह आपको देता है:

  1. आपके डेटाबेस को बाढ़ करने की कोशिश कर रहे हमलावर के खिलाफ सुरक्षा, क्योंकि ये अभी भी बहुत ही प्रभावशाली मात्रा में डेटा नहीं हैं।
  2. उम्मीद है कि अधिकांश ई-मेल पते इस लंबाई के नहीं हैं।

आप 64 पात्रों बेहद कठोर एक आवश्यकता पर विचार करते हैं, तो 255 बजाय का उपयोग करें, 127.5 की बुरी से बुरी हालत भंडारण वृद्धि कारक के लिए। हास्यास्पद? संभवतः। संभावना है? नहीं फास्ट? बहुत।

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