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

Zapytanie SQL wyszukujące wiersze spełniające wymagania Kolumna1 <=X <=Kolumna2 przebiega bardzo wolno

Znalazłem rozwiązanie, które opiera się na właściwościach danych w tabeli. Wolałbym mieć bardziej ogólne rozwiązanie, które nie zależy od bieżących danych, ale na razie jest to najlepsze, jakie mam.

Problem z pierwotnym zapytaniem:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

jest to, że wykonanie może wymagać przeskanowania dużego procentu wpisów w FirstX ,LastX ,P indeks, gdy pierwszy warunek FirstX <= ? spełnia duży procent wierszy.

Aby skrócić czas wykonania, zauważyłem, że LastX-FirstX jest stosunkowo mały.

Uruchomiłem zapytanie:

SELECT MAX(LastX-FirstX) FROM SomeTable;

i otrzymałem 4200000 .

Oznacza to, że FirstX >= LastX – 4200000 dla wszystkich wierszy w tabeli.

Więc aby spełnić LastX >= ? , musimy również spełnić FirstX >= ? – 4200000 .

Możemy więc dodać warunek do zapytania w następujący sposób:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

W przykładzie, który testowałem w pytaniu, liczba przetworzonych wpisów indeksu została zmniejszona z 2104820 do 18 a czas działania został skrócony z 0,563 sekundy do 0,0003 sekundy .

Przetestowałem nowe zapytanie z tym samym 120000 wartości X . Dane wyjściowe były identyczne ze starym zapytaniem. Czas spadł z ponad 10 godzin do 5,5 minuty , który jest ponad 100 razy szybszy .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie MYSQL zwracające 'identyfikator zasobu#12 zamiast wartości liczbowej, którą powinno zwrócić

  2. Zapytanie MySQL z wieloma instrukcjami AND wydaje się ignorować jedno

  3. Grupa parametrów AWS RDS nie zmienia kodowania MySQL

  4. PostgreSQL GROUP BY różni się od MySQL?

  5. auto_increment według grupy