Berdasarkan spesifikasi yang tidak lengkap, saya akan melakukan ini:
CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)
Indeks ini akan memenuhi persyaratan untuk indeks dengan storeid
sebagai kolom terdepan. (Dan kami tahu akan memiliki persyaratan itu jika ini adalah InnoDB dan storeid
adalah kunci asing.)
Dengan baris tabel yang begitu pendek, saya akan melanjutkan dan menjadikannya indeks penutup, dan menyertakan semua kolom. Kemudian kueri dapat dipenuhi langsung dari halaman indeks tanpa pencarian ke halaman data di tabel yang mendasarinya.
Karena kita tahu bahwa (seedid,storeid)
unik (diberikan sebagai PRIMARY KEY), kita tahu (storeid,seedid)
juga unik, jadi sebaiknya kita mendeklarasikan indeks menjadi UNIK.
Ada pilihan lain; kita tidak perlu membuat indeks di atas. Kita bisa saja melakukan ini sebagai gantinya:
CREATE INDEX stock_IX2 ON stock (storeid)
Tapi itu akan menggunakan jumlah ruang yang hampir sama, dan tidak bermanfaat untuk sebanyak mungkin kueri.
Indeks sekunder akan berisi kunci utama tabel; sehingga indeks kedua akan menyertakan seedid
kolom, mengingat KUNCI UTAMA dari tabel. Artinya, indeksnya setara dengan ini:
CREATE INDEX stock_IX3 ON stock (storeid,seedid)
Dan kita tahu kombinasi kedua kolom itu unik, jadi kita bisa memasukkan kata kunci UNIK
CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)
Jika kita melakukan EXPLAIN pada query berbentuk
EXPLAIN
SELECT t.storeid
, t.seedid
, t.stk
FROM stock t
WHERE t.storeid = 'foo'
kita cenderung melihat operasi pemindaian rentang pada indeks sekunder; tetapi mengambil nilai stk
kolom akan membutuhkan pencarian ke halaman data di tabel yang mendasarinya. Termasuk stk
kolom di indeks sekunder akan membuat indeks menjadi penutup indeks untuk kueri. Dengan indeks yang pertama kali direkomendasikan dalam jawaban, kami mengharapkan EXPLAIN
output untuk menampilkan "Menggunakan indeks".