Saya dihadapkan pada hal-hal berikut dan saya tidak yakin apa praktik terbaik.
Pertimbangkan tabel berikut (yang akan menjadi besar):
id PK | giver_id FK | penerima_id FK | tanggal
Saya menggunakan InnoDB dan dari apa yang saya pahami, ini membuat indeks secara otomatis untuk dua kolom kunci asing. Namun, saya juga akan melakukan banyak kueri di mana saya perlu mencocokkan kombinasi tertentu dari:
SELECT...WHERE giver_id = x AND recipient_id = t
.
Setiap kombinasi tersebut akan unik di tabel.
Apakah ada keuntungan dari menambahkan indeks dua kolom di atas kolom-kolom ini, atau apakah dua indeks individual secara teori cukup / sama?
Jawaban:
Jika Anda memiliki dua indeks kolom tunggal, hanya satu di antaranya yang akan digunakan dalam contoh Anda.
Jika Anda memiliki indeks dengan dua kolom, kueri mungkin lebih cepat (Anda harus mengukur). Indeks dua kolom juga dapat digunakan sebagai indeks kolom tunggal, tetapi hanya untuk kolom yang dicantumkan terlebih dahulu.
Terkadang bermanfaat untuk memiliki indeks pada (A, B) dan indeks lain pada (B). Ini membuat kueri yang menggunakan salah satu atau kedua kolom menjadi cepat, tetapi tentu saja menggunakan lebih banyak ruang disk.
Saat memilih indeks, Anda juga perlu mempertimbangkan efek penyisipan, penghapusan, dan pembaruan. Lebih banyak indeks = pembaruan lebih lambat.
sumber
Indeks penutup seperti:
... berarti indeks dapat digunakan jika kueri dirujuk
giver_id
, atau kombinasi darigiver_id
danrecipient_id
. Perhatikan bahwa kriteria indeks didasarkan pada paling kiri - kueri yang hanya merujuk padarecipient_id
tidak akan dapat menggunakan indeks penutup dalam pernyataan yang saya berikan.Selain itu, MySQL hanya dapat menggunakan satu indeks per SELECT sehingga indeks penutup akan menjadi cara terbaik untuk mengoptimalkan kueri Anda.
sumber
MySQL can only use one index per SELECT
ini tidak benar lagi, alangkah baiknya jika Anda mengedit jawaban Anda untuk diperbarui.recipient_id
?INDEX (col1, col2, col3, col4)
maka indeks akan diterapkan untuk pencarian denganWHERE
klausa seperticol1 = 'A'
ataucol1 = 'A' AND col2 = 'B'
ataucol1 = 'A' AND col2 ='B' AND col3 = 'C' AND col4 = 'D'
, tetapi indeks khusus ini tidak akan digunakan untuk hal-hal sepertiWHERE col2 = 'B'
atauWHERE col3 = 'C' AND col4 = 'D'
karena bidang pencarian tidak tersisa dalam definisi indeks. Anda harus menambahkan indeks tambahan untuk menutupi bidang tersebut.Jika salah satu indeks kunci asing sudah sangat selektif, maka mesin database harus menggunakan yang satu itu untuk kueri yang Anda tentukan. Kebanyakan mesin database menggunakan beberapa jenis heuristik untuk dapat memilih indeks yang optimal dalam situasi tersebut. Jika tidak ada indeks yang sangat selektif dengan sendirinya, mungkin masuk akal untuk menambahkan indeks yang dibangun pada kedua kunci karena Anda mengatakan Anda akan sering menggunakan jenis kueri tersebut.
Hal lain yang perlu dipertimbangkan adalah jika Anda dapat menghilangkan bidang PK dalam tabel ini dan menentukan indeks kunci utama pada bidang
giver_id
danrecipient_id
. Anda mengatakan bahwa kombinasinya unik, sehingga mungkin akan berhasil (mengingat banyak kondisi lain yang hanya Anda yang dapat menjawabnya). Biasanya, bagaimanapun, saya pikir kompleksitas tambahan yang menambahkan tidak sebanding dengan kerumitannya.sumber
Hal lain yang perlu dipertimbangkan adalah bahwa karakteristik kinerja dari kedua pendekatan akan didasarkan pada ukuran dan kardinalitas dataset. Anda mungkin menemukan bahwa indeks 2 kolom hanya menjadi lebih berkinerja pada ambang ukuran kumpulan data tertentu, atau sebaliknya. Tidak ada yang dapat menggantikan metrik kinerja untuk skenario Anda yang sebenarnya.
sumber