Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengindeks kolom yang memiliki nilai duplikat

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".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan data yang disandikan base64 sebagai tipe data BLOB atau TEXT

  2. bagaimana cara mengurutkan urutan LEFT JOIN dalam kueri SQL?

  3. node.js async/menunggu menggunakan dengan MySQL

  4. Apakah ada perintah MySQL untuk menjatuhkan semua indeks kecuali indeks PRIMARY?

  5. objek django+mysql='DatabaseWrapper' tidak memiliki atribut 'Database' error