Di InnoDB setiap indeks berisi kunci utama secara implisit.
Rencana penjelasan menunjukkan bahwa indeks IDX_NOME
digunakan pada tabel Paziente
. DBMS mencari nama dalam indeks dan menemukan ID_PAZIENTE
di sana, yang merupakan kunci yang kita butuhkan untuk mengakses tabel lainnya. Jadi tidak ada yang perlu ditambahkan. (Dalam DBMS lain kami akan menambahkan indeks komposit pada (NOME, ID_PAZIENTE)
agar ini terjadi.)
Lalu ada tabel Analisi
mempertimbangkan. Kami menemukan catatan melalui FK_ANALISI_PAZIENTE
yang berisi ID_PAZIENTE
yang digunakan untuk menemukan kecocokan, dan secara implisit kunci utama ID_ANALISI
yang dapat digunakan untuk mengakses tabel, tetapi ini bahkan tidak perlu, karena kita memiliki semua informasi yang kita butuhkan dari index. Tidak ada yang tersisa yang perlu kita temukan di tabel. (Sekali lagi, di DBMS lain kami akan menambahkan indeks komposit pada (ID_PAZIENTE, ID_ANALISI)
untuk memiliki indeks penutup.)
Jadi yang terjadi hanyalah:membaca satu indeks untuk membaca indeks lainnya untuk menghitung. Sempurna. Tidak ada yang perlu ditambahkan.
Kami bisa ganti COUNT(analisi0_.ID_ANALISI)
dengan COUNT(*)
karena yang pertama hanya mengatakan "hitung catatan di mana ID_ANALISI
bukan null", yang selalu terjadi sebagai ID_ANALISI
adalah kunci utama tabel. Jadi lebih mudah untuk menggunakan yang terakhir dan mengatakan "hitungan catatan". Namun, saya tidak berharap ini mempercepat kueri secara signifikan.
Jadi dari sudut pandang kueri, tidak ada yang mempercepat ini. Berikut adalah hal-hal lebih lanjut yang terlintas dalam pikiran:
- Tabel yang dipartisi? Tidak, saya tidak akan melihat manfaat dalam hal ini. Itu bisa lebih cepat jika kueri dieksekusi di utas paralel, tetapi sejauh yang saya tahu, tidak ada eksekusi paralel pada banyak partisi di MySQL. (Saya mungkin salah.)
- Mendefragmentasi tabel? Tidak, tabel itu sendiri bahkan tidak diakses dalam kueri.
- Itu memberi kita:Beli perangkat keras yang lebih baik. (Maaf tidak memiliki saran yang lebih baik untuk Anda.)