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

Jak przyspieszyć działanie tego zapytania?

Indeksy

  • Potrzebujesz - przynajmniej - indeks na każdym polu, które jest używane w JOIN stan.

  • Indeksy w polach, które pojawiają się w WHERE lub GROUP BY lub ORDER BY klauzule są również w większości przypadków przydatne.

  • Gdy w tabeli dwa lub więcej pól jest używanych w JOIns (lub WHERE lub GROUP BY lub ORDER BY), złożony (połączony) indeks tych (dwóch lub więcej) pól może być lepszy niż oddzielne indeksy. Na przykład w SiteNumbers tabela, możliwe indeksy to związek (number_accountid, number_active) lub (number_active, number_accountid) .

  • Warunek w polach, które są logiczne (ON/OFF, aktywne/nieaktywne) czasami spowalniają zapytania (ponieważ indeksy nie są selektywne i przez to nie są zbyt pomocne). Restrukturyzacja (normalizacja ojca) tabel jest w takim przypadku opcją, ale prawdopodobnie można uniknąć dodatkowej złożoności.

Oprócz zwykłych porad (zbadaj plan EXPLAIN, w razie potrzeby dodaj indeksy, przetestuj odmiany zapytania),

Zauważyłem, że w Twoim zapytaniu znajduje się częściowy Produkt Kartezjański. Tabela Accounts ma relacje jeden-do-wielu z trzema tabelami FTPDetails , SiteNumbers i PPC . Powoduje to, że jeśli masz na przykład 1000 kont, a każde konto jest powiązane z, powiedzmy, 10 szczegółami FTP, 20 numerami witryny i 3 PPC, zapytanie zwróci dla każdego konta 600 wierszy (iloczyn 10x20x3). Łącznie 600 tys. wierszy, w których duplikuje się wiele danych.

Zamiast tego można podzielić zapytanie na trzy plus jeden dla danych podstawowych (konto i pozostałe tabele). W ten sposób przesłano by tylko 34 tys. wierszy danych (mających mniejszą długość) :

Accounts JOIN Clients JOIN Users 
  (with all fields needed from these tables)
  1K rows

Accounts JOIN FTPDetails
  (with Accounts.account_id and all fields from FTPDetails)
  10K rows

Accounts JOIN SiteNumbers
  (with Accounts.account_id and all fields from SiteNumbers)
  20K rows

Accounts JOIN PPC
  (with Accounts.account_id and all fields from PPC)
  3K rows

a następnie użyj danych z 4 zapytań po stronie klienta, aby wyświetlić połączone informacje.

Dodałbym następujące indeksy:

Table Accounts
  index on (account_designer)
  index on (account_client)
  index on (account_active, account_id)
  index on (account_update)

Table FTPDetails
  index on (ftp_active, ftp_accountid)

Table SiteNumbers
  index on (number_active, number_accountid)

Table PPC
  index on (ppc_active, ppc_accountid)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CROSS/OUTER APPLY w MySQL

  2. DbUpdateConcurrencyException przy użyciu Entity Framework 6 z MySql

  3. Tabela Schrödingers MySQL:istnieje, ale jej nie ma

  4. Oddziel różne wersje strony internetowej

  5. Ciąg znaków ucieczki do użycia w wyszukiwaniu pełnotekstowym MySQL