Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pengindeksan yang benar oleh Join-Where-Group Dengan memilih kueri menghindari Menggunakan sementara; Menggunakan filesort

Saya akan menulis kueri seperti ini:

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

Saya pasti akan memiliki indeks di cell dengan time sebagai kolom terdepan.

MySQL dapat menggunakan indeks yang sama untuk memenuhi predikat rentang (dalam klausa WHERE), dan untuk memenuhi GROUP BY tanpa operasi "Menggunakan filesort".

... ON cell (time)

Tergantung pada ukuran kolom, indeks penutup mungkin memberikan kinerja yang optimal. Indeks penutup mencakup semua kolom dari tabel yang direferensikan dalam kueri, sehingga kueri dapat dipenuhi sepenuhnya dari halaman indeks tanpa mencari halaman di tabel yang mendasarinya.

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

Untuk indeks di swap_plan , saya akan memiliki indeks dengan site_id sebagai kolom utama, dan menyertakan clustername kolom, salah satu dari:

... ON swap_plan (clustername, site_id)

atau

... ON swap_plan (site_id, clustername)

Sepertinya akan ada batasan UNIK pada kombinasi kedua kolom tersebut, yaitu nilai site_id akan berbeda untuk clustername yang diberikan . (Jika bukan itu masalahnya, dan (site_id,clustername) yang sama tuple muncul beberapa kali, ada potensi agregat total counter untuk digelembungkan.

Saya akan mencari EXPLAIN output untuk menampilkan pencarian 'ref' ke swap_plan tabel dari nilai c.siteid dan nilai const (literal 'Cluster A') untuk nama cluster.

Dengan tabel berukuran 31 baris dan 368 baris, kita tidak akan melihat perbedaan kinerja yang signifikan (waktu berlalu) antara rencana eksekusi yang optimal dan rencana eksekusi yang buruk.

Ketika salah satu tabel menskalakan hingga jutaan baris, saat itulah perbedaannya akan terlihat. Pilihan pengoptimal dari rencana eksekusi dipengaruhi oleh statistik (ukuran, jumlah baris, kardinalitas kolom) dari setiap tabel, sehingga rencana eksekusi dapat berubah dengan peningkatan ukuran tabel.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menambahkan nol di depan ke panjang char yang berbeda di mysql?

  2. Bagaimana cara menggabungkan fungsi agregat di MySQL?

  3. apa cara terbaik untuk melakukan internasionalisasi di php?

  4. MySQL AUTO_INCREMENT tidak ROLLBACK

  5. Masukkan ke tabel Mysql saat pengguna menutup browser?