Apakah saya perlu menambahkan indeks kolom tunggal baru ke tabel jika indeks multi-kolom pada bidang itu sudah ada?

10

Saya sudah punya tabel dengan UNIQUEindeks multi-kolom _job_id__dan __keyword_id__.

Apakah saya juga perlu menambahkan indeks lain __job_id__jika saya memiliki permintaan yang sering melakukan GROUP BYdi kolom itu?

(Pada 100 juta baris bisa memakan waktu cukup lama. Inilah sebabnya saya meminta alih-alih hanya melakukan)

JIStone
sumber
Jika pertanyaan Anda sebenarnya adalah tentang permintaan yang lambat, maka berikan SHOW CREATE TABLE SHOW TABLE STATUS SHOW VARIABEL SEPERTI '% buffer%' JELASKAN SELEKSI ... Berapa banyak RAM yang tersedia? Ada banyak kemungkinan alasan; sebagian besar dapat dilihat dengan melihat barang-barang itu.
Rick James

Jawaban:

5

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 !!!

RolandoMySQLDBA
sumber
Apakah kamu yakin Orang ini menyarankan sebaliknya: stackoverflow.com/questions/179085/… atau ini berbeda dari MySQL ke MSSQL?
Tadej
4

Indeks hanya dapat mempercepat group byoperasi 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 dengan hash group byoperasi yang biasanya akan memotong manfaat indeks sama sekali - mungkin orang lain dapat mengkonfirmasi ini.

Ada manfaat marjinal untuk memiliki indeks terpisah job_iddengan asumsi itu adalah satu-satunya kolom dalam group byklausa 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_idhanya akan lebih kecil dari indeks pada job_id, keyword_idjika keyword_idbukan bagian dari indeks berkerumun.

Jack mengatakan coba topanswers.xyz
sumber