Indeks penutup tidak sama dengan indeks komposit.
Jika saya memiliki 2 indeks terpisah satu di col3 dan yang lainnya di col4, Yang mana dari mereka yang akan digunakan dalam kueri ini?
Indeks dengan kardinalitas tertinggi.
MySQL menyimpan statistik indeks mana yang memiliki properti apa.
Indeks yang memiliki daya pembeda paling besar (seperti yang terlihat dalam statistik MySQL) akan digunakan.
Saya membaca bahwa untuk setiap tabel dalam kueri hanya satu indeks yang digunakan. Apakah itu berarti tidak ada cara bagi kueri untuk menggunakan kedua indeks ?
Anda dapat menggunakan subselect.
Atau lebih baik menggunakan indeks gabungan yang menyertakan col3 dan col4.
Kedua, Jika saya membuat indeks komposit menggunakan col3 dan col4 bersama-sama tetapi hanya menggunakan col3 di klausa WHERE apakah itu akan lebih buruk untuk kinerjanya? contoh:
Indeks gabungan
Istilah yang benar adalah compound
indeks, bukan gabungan.
Hanya paling kiri bagian dari indeks majemuk akan digunakan.
Jadi jika indeks didefinisikan sebagai
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
Lihat:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html
Perhatikan bahwa jika Anda memilih bidang paling kiri, Anda dapat lolos dengan tidak menggunakan bagian indeks itu di klausa where Anda.
Bayangkan kita memiliki indeks gabungan
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Alasan mengapa ini berhasil adalah karena kueri pertama menggunakan indeks penutup dan melakukan pemindaian pada itu.
Kueri kedua perlu mengakses tabel dan oleh karena itu pemindaian meskipun indeks tidak masuk akal.
Ini hanya berfungsi di InnoDB.
Apa yang dimaksud dengan indeks penutup
Indeks penutup mengacu pada kasus ketika semua bidang yang dipilih dalam kueri covered
oleh indeks, dalam hal ini InnoDB (bukan MyISAM) tidak akan pernah membaca data dalam tabel, tetapi hanya menggunakan data dalam indeks, secara signifikan mempercepat pemilihan.
Perhatikan bahwa di InnoDB kunci utama disertakan dalam semua indeks sekunder, jadi bisa dibilang semua indeks sekunder adalah indeks gabungan.
Ini berarti jika Anda menjalankan kueri berikut di InnoDB:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL akan selalu menggunakan indeks penutup dan tidak akan mengakses tabel yang sebenarnya. Meskipun dapat menggunakan indeks penutup, ia akan memilih PRIMARY KEY
karena hanya perlu menekan satu baris.