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

Optymalizacja wyszukiwania MySQL za pomocą polubień i symboli wieloznacznych

Jak długie są twoje struny?

Jeśli są stosunkowo krótkie (np. angielskie słowa; avg_len=5) i masz wolne miejsce w bazie danych, wypróbuj następujące podejście:

  • Dla każdego słowa, które chcesz zapisać w tabeli, zamiast tego weź każdy możliwy przyrostek tego słowa. Innymi słowy, usuwasz pierwszy znak, aż nic nie zostanie. Na przykład słowo value daje:
    • value
    • value
    • lue
    • ue
    • e
  • Przechowuj każdy tych przyrostków w bazie danych.
  • Możesz teraz wyszukiwać podciągi za pomocą LIKE 'alu%' (który znajdzie „alu” jako część „value”).

Przechowując wszystkie przyrostki, usuniesz potrzebę używania wiodącego symbolu wieloznacznego (pozwalając na użycie indeksu do szybkiego wyszukiwania), kosztem miejsca do przechowywania.

Koszt przechowywania

Liczba znaków wymagana do przechowania słowa to word_len*word_len / 2 , tj. kwadratowa długość słowa, w przeliczeniu na słowo. Oto współczynnik wzrostu dla różnych rozmiarów słów:

  • Słowo trzyliterowe:(3*3/2) / 3 = 1.5
  • 5-literowe słowo:(5*5/2) / 5 = 2.5
  • 7-literowe słowo:(7*7/2) / 7 = 3.5
  • 12-literowe słowo:(12*12/2) / 12 = 6

Liczba wierszy wymaganych do przechowywania słowa wzrasta z 1 do word_len . Uważaj na to obciążenie. Dodatkowe kolumny należy ograniczyć do minimum, aby uniknąć przechowywania dużych ilości nadmiarowych danych. Na przykład numer strony, na której pierwotnie znaleziono słowo, powinien być w porządku (pomyśl unsigned smallint), ale obszerne metadane dotyczące słowa powinny być przechowywane w osobnej tabeli dla poszczególnych słów, a nie dla każdego przyrostka.

Rozważania

Istnieje kompromis polegający na tym, że dzielimy „słowa” (lub fragmenty). Jako przykład ze świata rzeczywistego:co robimy z myślnikami? Czy przechowujemy przymiotnik five-letter? jako jedno lub dwa słowa?

Kompromis jest następujący:

  • Czegokolwiek, co jest podzielone, nie można znaleźć jako pojedynczego elementu. Jeśli przechowujemy five i letter osobno, wyszukując five-letter lub fiveletter nie powiedzie się.
  • Wszystko, co nie rozbite zajmie więcej miejsca do przechowywania. Pamiętaj, że długość słowa zwiększa się kwadratowo.

Dla wygody możesz usunąć myślnik i zapisać fiveletter . Słowo można teraz znaleźć, wyszukując five , letter i fiveletter . (Jeśli usuniesz również myślniki z dowolnego zapytania wyszukiwania, użytkownicy nadal będą mogli z powodzeniem znaleźć five-letter .)

Wreszcie, istnieją sposoby przechowywania tablic sufiksów, które nie wiążą się z dużym obciążeniem, ale nie jestem jeszcze pewien, czy dobrze przekładają się na bazy danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_INSERT() – Wstaw wartości do dokumentu JSON w MySQL

  2. Jak wyodrębnić dwie kolejne cyfry z pola tekstowego w MySQL?

  3. MySQL — Odzyskaj porzuconą bazę danych schematów wydajności

  4. Poznaj MySQL – Tydzień Nowych Technologii

  5. Jak pomyślnie przepisać stary kod mysql-php z przestarzałymi funkcjami mysql_*?