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

Szybkość słowa kluczowego IN w MySQL/PostgreSQL

W PostgreSQL dokładnie to, co tu otrzymasz, zależy od tabeli bazowej, więc powinieneś użyć EXPLAIN ANALYZE w niektórych przykładowych zapytaniach względem użytecznego podzbioru danych, aby dokładnie określić, co optymalizator ma zamiar zrobić (upewnij się, że tabele bieganie przeciwko również zostały ANALIZOWANE). IN można przetwarzać na kilka różnych sposobów i dlatego musisz przyjrzeć się niektórym próbkom, aby dowiedzieć się, która alternatywa jest używana dla twoich danych. Nie ma prostej ogólnej odpowiedzi na Twoje pytanie.

Jeśli chodzi o konkretne pytanie, które dodałeś w swojej wersji, w porównaniu z trywialnym zestawem danych bez żadnych indeksów, oto przykład dwóch planów zapytań, które otrzymasz:

postgres=# explain analyze select * from x where s in ('123','456');
 Seq Scan on x  (cost=0.00..84994.69 rows=263271 width=181) (actual time=0.015..1819.702 rows=247823 loops=1)
   Filter: (s = ANY ('{123,456}'::bpchar[]))
 Total runtime: 1931.370 ms

postgres=# explain analyze select * from x where s='123' or s='456';
 Seq Scan on x  (cost=0.00..90163.62 rows=263271 width=181) (actual time=0.014..1835.944 rows=247823 loops=1)
   Filter: ((s = '123'::bpchar) OR (s = '456'::bpchar))
 Total runtime: 1949.478 ms

Te dwa środowiska wykonawcze są zasadniczo identyczne, ponieważ rzeczywisty czas przetwarzania jest zdominowany przez sekwencyjne skanowanie całej tabeli; wielokrotne uruchamianie pokazuje, że różnica między nimi jest poniżej marginesu błędu uruchomienia do uruchomienia. Jak widać, PostgreSQL przekształca przypadek IN w użycie filtra DOWOLNEGO, który zawsze powinien działać szybciej niż seria OR. Ponownie, ten trywialny przypadek niekoniecznie odzwierciedla to, co zobaczysz w poważnym zapytaniu, w którym zaangażowane są indeksy i tym podobne. Niezależnie od tego, ręczne zastępowanie IN serią instrukcji OR nigdy nie powinno być szybsze, ponieważ optymalizator wie, co należy zrobić, jeśli ma dobre dane do pracy.

Ogólnie rzecz biorąc, PostgreSQL zna więcej sztuczek dotyczących optymalizacji skomplikowanych zapytań niż optymalizator MySQL, ale również w dużym stopniu polega na tym, że dostarczyłeś optymalizatorowi wystarczającą ilość danych do pracy. Pierwsze linki w sekcji „Optymalizacja wydajności” wiki PostgreSQL obejmują najważniejsze rzeczy potrzebne do uzyskania dobrych wyników z optymalizatora.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLSTATE[HY093]:Nieprawidłowy numer parametru:parametr nie został zdefiniowany

  2. Nie można połączyć się z żadnym z podanych hostów MySQL

  3. com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Zduplikowany wpis „” dla klucza „PRIMARY”

  4. Jak skonfigurować replikację MySQL w RHEL, Rocky i AlmaLinux?

  5. Ruby CSV odczytuje pola wielowierszowe