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

Optymalizacja zapytań MySQL LIKE term% ORDER BY int

Zadałeś kolejne pytanie „Tworzenie indeksu, który najlepiej nadaje się do wyszukiwania z użyciem symboli wieloznacznych w 40 milionach nazw”. OK, masz 40 milionów rekordów.

Teraz rozważ następującą formułę:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Indeks na kolumnie jest znacznie lepszy, im bliżej x ma wartość 1. Jeśli wynosi 1, wszystkie wartości są różne, nie ma duplikatów, a zatem indeks jest dość szybki.

Teraz szukasz 'john%'. To 4 litery i otwarty koniec. Które litery nie są ważne, twój DB musi radzić sobie z 26*26*26*26=456976 różnymi wartościami. Umieść to w powyższym wzorze i swoich 40 milionach płyt. Otrzymujesz x z 0,0114244.

Znowu nie wiem jaki jest próg, ale IIRC to 0,1 czy coś. Tak więc, jeśli jesteś x jest powyżej 0,1 indeks jest używany, jeśli jest niższy, to nie.

Dlaczego to jest takie? Używanie indeksu może nawet spowolnić działanie, ponieważ twój DB musi spojrzeć na indeks, zobaczyć w tym indeksie, na której pozycji na twoim fizycznym dysku twardym znajduje się odpowiedni rekord, a następnie uzyskać ten rekord. Dlatego, gdy x jest poniżej 10%, szybsze jest wykonanie skanowania całej tabeli.

Podsumowując:filtrowanie 40 milionów rekordów za pomocą tylko jednego słabego indeksu, takiego jak twój, jest po prostu bezużyteczne.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wycofanie MySQL w przypadku transakcji z utraconym/rozłączonym połączeniem

  2. Połączyć się z bazą danych MySQL w C# jako użytkownik inny niż root?

  3. Najlepszy sposób na znalezienie ostatniego wstawionego identyfikatora w mysql za pomocą php

  4. wp-admin nie może uzyskać dostępu po przeniesieniu

  5. Uzyskaj najstarszą wartość daty i godziny za pomocą mysql