Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Optimierung für REGEXP

Wenn Sie WHERE im Regexp-Stil verwenden müssen -Klauseln werden Sie definitiv von Slow-Query-Problemen geplagt. Damit die Suche im Regexp-Stil funktioniert, muss MySQL jeden Wert in Ihrer Namensspalte mit dem Regexp vergleichen. Und Ihre Abfrage hat den Ärger verdoppelt, indem Sie sich auch die Spalte mit Ihrem Benutzernamen angesehen hat.

Das bedeutet, dass MySQL keine Indizes nutzen kann, wodurch alle DBMSs Abfragen großer Tabellen beschleunigen.

Es gibt ein paar Dinge, die Sie ausprobieren können. Alle beinhalten den Abschied von REGEXP.

Einer ist dieser:

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Wenn Sie Indizes für Ihre Namens- und Benutzernamensspalten erstellen, sollte dies anständig schnell sein. Es wird nach allen Namen/Benutzernamen gesucht, die mit „Jack“ beginnen. BEACHTEN SIE, dass

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

sucht nach Namen, die mit „Jack“ enden, ist aber langsam wie Ihre Suche im Regexp-Stil.

Sie können auch herausfinden, warum Ihre Anwendung in der Lage sein muss, nach einem Teil eines Namens oder Benutzernamens zu suchen. Sie können diese Funktion entweder aus Ihrer Anwendung entfernen oder einen besseren Weg finden, damit umzugehen.

Mögliche bessere Wege:

  1. Bitten Sie Ihre Benutzer, ihre Namen in Vornamen- und Nachnamenfelder aufzuteilen und separat zu suchen.
  2. Erstellen Sie eine separate Funktion zum Durchsuchen aller Benutzer, die nur verwendet wird, wenn ein Benutzer sie benötigt, und reduzieren Sie so die Häufigkeit Ihrer langsamen Abfragen im Regexp-Stil.
  3. Teilen Sie ihre Namen selbst mit einem Vorverarbeitungsprogramm in eine separate Namens-Wort-Tabelle auf. Durchsuchen Sie die Name-Wörter-Tabelle ohne regulären Ausdruck.
  4. Finden Sie heraus, wie Sie die MySQL-Volltextsuche für diese Funktion verwenden.

All dies erfordert etwas Programmierarbeit.