Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Optymalizacja MySQL dla REGEXP

Jeśli musisz użyć wyrażenia WHERE w stylu regexp klauzul, na pewno będziesz nękany problemami z wolnymi zapytaniami. Aby wyszukiwanie w stylu regexp działało, MySQL musi porównać każdą wartość w kolumnie nazwy z wyrażeniem regularnym. Twoje zapytanie podwoiło problem, patrząc również na kolumnę nazwy użytkownika.

Oznacza to, że MySQL nie może korzystać z żadnych indeksów, dzięki czemu wszystkie DBMS przyspieszają zapytania dotyczące dużych tabel.

Jest kilka rzeczy, których możesz spróbować. Wszystkie z nich obejmują pożegnanie z REGEXP.

Jednym z nich jest:

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

Jeśli tworzysz indeksy na kolumnach swojego nazwiska i nazwy użytkownika, powinno to być przyzwoicie szybkie. Będzie szukał wszystkich nazw/nazw użytkownika zaczynających się od „jack”. ZAUWAŻ, że

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

będzie szukał nazw kończących się na „jack”, ale będzie powolny jak wyszukiwanie w stylu wyrażenia regularnego.

Inną rzeczą, którą możesz zrobić, to dowiedzieć się, dlaczego Twoja aplikacja musi mieć możliwość wyszukiwania części nazwy lub nazwy użytkownika. Możesz albo wyeliminować tę funkcję ze swojej aplikacji, albo znaleźć lepszy sposób jej obsługi.

Możliwe lepsze sposoby:

  1. Poproś użytkowników, aby podzielili swoje imiona na pola imienia i nazwiska i przeprowadzili oddzielne wyszukiwanie.
  2. Utwórz osobną funkcję „przeszukaj wszystkich użytkowników”, która będzie używana tylko wtedy, gdy użytkownik tego potrzebuje, zmniejszając w ten sposób częstotliwość zapytań w stylu powolnego wyrażenia regularnego.
  3. Sam podziel ich imiona na osobną tabelę imion i słów, używając jakiegoś programu do wstępnego przetwarzania. Przeszukaj tabelę nazwa-słowa bez wyrażenia regularnego.
  4. Dowiedz się, jak korzystać z wyszukiwania pełnotekstowego MySQL dla tej funkcji.

Wszystko to wymaga pewnej pracy programistycznej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać nowe wiersze do jTable z bazy danych, klikając przycisk bez czyszczenia istniejących wierszy?

  2. Funkcja MySQL POW() – podnieś wartość do potęgi innej wartości

  3. Tabele przestawne w MySQL

  4. Błąd połączenia php MySql

  5. podstawowe porównanie dat w celu sprawdzenia ważności