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

Prawidłowe indeksowanie przez Dołącz-Gdzie-Grupa Przez wybrane zapytania Unikanie Korzystanie z tymczasowego; Korzystanie z sortowania plików

Zapytałbym tak:

SELECT c.time
     , SUM(c.counter)
     , MAX(p.clustername) AS clustername
  FROM cell c

  JOIN swap_plan p
    ON p.siteid      = c.siteid
   AND p.clustername = 'Cluster A'

 WHERE c.time  >=  'day1'
   AND c.time  <=  'day2'
 GROUP
    BY c.time

Chciałbym mieć indeks na cell z time jako wiodąca kolumna.

MySQL może użyć tego samego indeksu, aby spełnić predykat zakresu (w klauzuli WHERE) i spełnić warunek GROUP BY bez operacji „Using filesort”.

... ON cell (time)

W zależności od rozmiarów kolumn indeks pokrycia może zapewnić optymalną wydajność. Indeks pokrywający zawiera wszystkie kolumny z tabeli, do których odwołuje się zapytanie, więc zapytanie może być w całości spełnione ze stron indeksu bez wyszukiwania stron w tabeli bazowej.

... ON cell (time, siteid, counter)

Indeks na swap_plan , miałbym indeks z site_id jako wiodącą kolumnę, z uwzględnieniem clustername kolumna, dowolna z:

... ON swap_plan (clustername, site_id)

lub

... ON swap_plan (site_id, clustername)

Wygląda na to, że na połączeniu tych dwóch kolumn, tj. wartościach site_id, pojawi się ograniczenie typu UNIQUE będzie odrębna dla danego clustername . (Jeśli tak nie jest, i ten sam (site_id,clustername) krotka pojawia się wiele razy, istnieje możliwość zagregowania sumy counter być napompowanym.

szukałbym EXPLAIN wyjście, aby pokazać odnośnik 'ref' do swap_plan tabela z wartości c.siteid i wartość const (dosłownie „Cluster A”) dla nazwy klastra.

W przypadku tabel o rozmiarze 31 i 368 wierszy nie zobaczymy znaczącej różnicy w wydajności (upływający czas) między optymalnym planem wykonania a okropnym planem wykonania.

Kiedy któraś z tabel skaluje się do milionów wierszy, wtedy różnice staną się widoczne. Na wybór planu wykonania optymalizatora mają wpływ statystyki (rozmiar, liczba wierszy, liczność kolumn) każdej tabeli, więc plan wykonania może się zmieniać wraz ze wzrostem rozmiarów tabeli.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy jdbc obsługuje język perski?

  2. jquery do wypełnienia wielu list rozwijanych z bazy danych

  3. Google Dataflow (Apache beam) JdbcIO zbiorczo wstawiamy do bazy danych mysql

  4. laravel errno 150 ograniczenie klucza obcego jest nieprawidłowo utworzone

  5. Nieznana kolumna Laravela „updated_at”