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

Mysql sam zapyta jeden z indeksem drugi bez uzyskania czasu 10000xFetch?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

ma 3 problemy z wydajnością:

  • OR jest słabo zoptymalizowany. Zasadniczo tabelę należy przeskanować, aby sprawdzić wszystkie wiersze. Indeksy raczej nie pomogą.
  • UPPER(indexed-column) zapobiega używaniu indeksu w tej kolumnie. Można to łatwo obejść, aby uniknąć deklarowania, że ​​kolumna ma COLLATION to jest „niewrażliwe na wielkość liter” – czyli coś w rodzaju utf8_unicode_ci; zwróć uwagę na _ci .
  • LIKE '%... nie można użyć indeksu z powodu wiodącego symbol wieloznaczny.

Ponadto zwykle głupotą jest posiadanie

32497 row(s) returned

Co zamierzasz zrobić z tyloma rzędami? Czas transferu w sieci będzie znaczący, nawet jeśli samo zapytanie nie jest.

Aby „rozwiązać” LIKE , OR i UPPER wszystkie problemy naraz, zbierz tekst w jednej kolumnie w jednej tabeli. Następnie podaj FULLTEXT indeks w tej kolumnie. MATCH ... AGAINST ... będzie działać znacznie szybciej - przynajmniej za wykonanie SomeName Szukaj. (LEFT JOINs to inna sprawa.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wartość czasu MySQL w zapytaniu 838:59:59?

  2. PHP:sortowanie wyników MySQL do tablicy wielowymiarowej

  3. Kompilowanie łącznika MySQL z Visual Studio 2015 Win64

  4. diff 2 duże tabele bazy danych

  5. Wywołanie niezdefiniowanej metody Closure::query()