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.)