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

mysql:wybór najbardziej wydajnego zapytania spośród dwóch

Nie ma wątpliwości, że wersja 1 - oddzielne klauzule gdzie po każdej stronie unii - będzie szybsza. Przyjrzyjmy się, dlaczego wersja — gdzie klauzula nad wynikiem związku — jest gorsza:

  • Ilość danych:zawsze będzie więcej wierszy w wyniku sumy, ponieważ jest mniej warunków dotyczących zwracanych wierszy. Oznacza to więcej dyskowych operacji we/wy (w zależności od indeksów), więcej tymczasowej pamięci do przechowywania zestawu wierszy, co oznacza dłuższy czas przetwarzania
  • powtarzane skanowanie:cały wynik łączenia musi zostać ponownie przeskanowany, aby zastosować warunek, gdy mógł zostać obsłużony podczas początkowego skanowania. Oznacza to podwójną obsługę zestawu wierszy, choć prawdopodobnie w pamięci, ale nadal jest to dodatkowa praca.
  • indeksy nie są używane dla klauzul where w wyniku sumy. Jeśli masz indeks nad polami kluczy obcych i postType, nie będzie używany

Jeśli chcesz maksymalnej wydajności, użyj UNION ALL , który przekazuje wiersze bezpośrednio do wyniku bez narzutu, zamiast UNION , który usuwa duplikaty (zwykle przez sortowanie) i może być kosztowny i jest niepotrzebny na podstawie Twoich komentarzy

Zdefiniuj te indeksy i użyj wersji 1, aby uzyskać maksymalną wydajność:

create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Włączanie ogólnego dziennika zapytań MySQL z JDBC

  2. Najlepsza praktyka obsługi błędów przy użyciu PDO

  3. MySQL Fire-And-Forget INSERT / UPDATE / DELETE - wskazane użycie mysql_unbuffered_query?

  4. Zapytanie MySQL:wstaw, jeśli wpis jest zduplikowany, w przeciwnym razie zaktualizuj istniejące wartości wierszy

  5. Nie można połączyć się z RDS mysql DB z Wordpress na Amazon linux EC2 Instance