Saya sudah punya tabel dengan UNIQUE
indeks multi-kolom _job_id__
dan __keyword_id__
.
Apakah saya juga perlu menambahkan indeks lain __job_id__
jika saya memiliki permintaan yang sering melakukan GROUP BY
di kolom itu?
(Pada 100 juta baris bisa memakan waktu cukup lama. Inilah sebabnya saya meminta alih-alih hanya melakukan)
Jawaban:
Tidak, tidak sama sekali !!! MySQL Query Optimizer akan melakukan hal yang benar jika kolom utama yang diperlukan berada paling kiri dalam indeks. Jika Anda memang membuat indeks seperti itu, Pengoptimal Permintaan MySQL dapat memilih untuk tidak pernah menggunakan indeks itu jika Anda selalu melakukan GROUP BY job_id, keyword_id. MySQL Query Optimizer mungkin atau mungkin tidak menggunakan indeks jika Anda mengumpulkan catatan hanya dari job_id, tetapi Anda tetap memiliki indeks yang memboroskan ruang.
Jika tabelnya adalah MyISAM, membuat indeks seperti itu hanya akan menggembungkan file MYI.
Jika tabelnya adalah InnoDB dan innodb_file_per_table adalah 0, membuat indeks seperti itu hanya akan mengasapi ibdata1.
Jika tabel adalah InnoDB dan innodb_file_per_table adalah 1, membuat indeks seperti itu hanya akan mengasapi file .ibd dari tabel.
Singkatnya, Anda tidak perlu membuat indeks tambahan itu !!!
sumber
Indeks hanya dapat mempercepat
group by
operasi dengan mengurangi pengurutan - ini akan lebih efisien jika indeks yang digunakan adalah indeks berkerumun atau setidaknya memiliki kolom utama yang sama dengan indeks berkerumun. Dalam semua ini saya mengasumsikan MySQL tidak memiliki setara denganhash group by
operasi yang biasanya akan memotong manfaat indeks sama sekali - mungkin orang lain dapat mengkonfirmasi ini.Ada manfaat marjinal untuk memiliki indeks terpisah
job_id
dengan asumsi itu adalah satu-satunya kolom dalamgroup by
klausa dan tidak ada indeks berkerumun: indeks akan lebih kecil dan karenanya pemindaian akan menghasilkan lebih sedikit I / O--EDIT--
Karena indeks berisi semua bidang kunci utama yang ditentukan untuk kunci indeks berkerumun yang tidak ada dalam indeks sekunder , indeks pada
job_id
hanya akan lebih kecil dari indeks padajob_id, keyword_id
jikakeyword_id
bukan bagian dari indeks berkerumun.sumber