2016-09-28 1 views
1

erzwingen Wenn Sie ein indiziertes Feld in MySQL InnoDB-Tabelle (seien wir Begriff hier nennen) haben, können Sie nur verwenden:Wie MySQL/InnoDB-Index auf Ausdruck LIKE% ...%

term LIKE 'step%' 

Art von Abfragen mit % Symbol am Ende wenn Sie Index arbeiten möchten. Mit anderen Worten:

können Sie indiziert Suche nach Präfixe tun nur

es eine Abhilfe für diese Einschränkung ist, dass in certian Fällen funktionieren.

+0

Wenn Sie den gesamten Index scannen müssen, weil Sie nicht auf seine Bestellung verlassen können, was wäre der Leistungsvorteil sein? (Auf keinen Fall denke ich, dass es eine schlechte Frage ist.) –

+0

@ ÁlvaroGonzález Es ist eine häufige Frage, und ich möchte einen Trick teilen, den ich für SO-Benutzer verwende. –

Antwort

2

Wichtig! Das ist eine Problemumgehung und es passt nicht alle Fälle. Aber in bestimmten Situationen kann es nützlich sein.

Diese Problemumgehung hilft, die Leistung zu sparen, wird jedoch durch Verwendung zusätzlicher Speichermengen bezahlt.

Beispiel Fall

Setup Lassen Sie uns ein einfaches Beispielfall:

term 
------------------ 
... 
Understanding InnoDB clustered indexes 
... 

und Benutzer alle Bedingungen stimmen mit den folgenden Prädikat suchen:

term LIKE '%InnoDB%' 

Bei vereinfachen Sie Begriff wie InnoDB%, wird diese Phrase von der Suche verloren.

Umgehung

  1. Rterm Säule einführen, die umgekehrt Begriff enthalten:

    term          rterm 
    ------------------ 
    ... 
    Understanding InnoDB clustered indexes sexedni deretsulc BDonnI gnidnatsrednU 
    ... 
    
  2. Fügen Sie einen Index auf die Spalte Rterm:

    ALTER TABLE `t_term` 
    ADD INDEX `rterm` (`rterm`); 
    

    oder Einzigen auf Ihrem Fall abhängig:

    ALTER TABLE `t_term` 
    ADD UNIQUE `rterm` (`rterm`); 
    
  3. Suche Nehmen durch das folgende Prädikat:

    term LIKE 'InnoDB%' OR rterm LIKE 'BDonnI%' 
    

    wo 'BDonnI' ist eine umgekehrte Zeichenfolge für 'InnoDB'.

  4. Gewinn!

Abfrage-Plan

enter image description here

MySQL-Abfrage Rterm columnn

MySQL verfügt über eine praktische String-Funktion REVERSE() zu füllen. So füllen Rterm Spalte Verwendung:

UPDATE t_term SET rterm = REVERSE(term) 
+0

Nun, dies erfordert nicht wirklich die Verwendung von Indizes für 'LIKE% ...%' wie in der Frage angegeben, oder? ;-P –

+1

wow, es funktioniert wie ein Zauber. Danke – Learner

+0

@ ÁlvaroGonzález Es ist definitiv nicht. Der Fragetitel ist so konzipiert, dass diese Problemumgehung über die Suche gefunden werden kann. In der Praxis imitiert es den vollständigen Index, indem es zwei Indizes durchsucht und die Ergebnisse zusammenführt. –

Verwandte Themen