Perbedaan antara INDEX, PRIMARY, UNIQUE, FULLTEXT di MySQL?

Jawaban:

674

Perbedaan

  • KEY atau INDEX mengacu pada indeks non-unik yang normal. Nilai yang tidak berbeda untuk indeks diizinkan, sehingga indeks dapat berisi baris dengan nilai yang sama di semua kolom indeks. Indeks ini tidak memberlakukan batasan apa pun pada data Anda sehingga hanya digunakan untuk akses - untuk dengan cepat mencapai rentang rekaman tertentu tanpa memindai semua catatan.

  • UNIQUE mengacu pada indeks di mana semua baris indeks harus unik. Yaitu, baris yang sama mungkin tidak memiliki nilai non-NULL identik untuk semua kolom dalam indeks ini sebagai baris lain. Selain digunakan untuk dengan cepat mencapai rentang rekaman tertentu, indeks UNIQUE dapat digunakan untuk menegakkan pembatasan pada data, karena sistem database tidak memungkinkan aturan nilai yang berbeda untuk dilanggar saat memasukkan atau memperbarui data.

    Sistem basis data Anda memungkinkan indeks UNIK diterapkan pada kolom yang memungkinkan nilai NULL, dalam hal ini dua baris dibolehkan identik jika keduanya berisi nilai NULL (alasannya di sini adalah bahwa NULL dianggap tidak sama dengan dirinya sendiri). Bergantung pada aplikasi Anda, bagaimanapun, Anda mungkin menemukan ini tidak diinginkan: jika Anda ingin mencegah ini, Anda harus melarang nilai NULL di kolom yang relevan.

  • PRIMARY bertindak persis seperti indeks UNIK, kecuali bahwa itu selalu bernama 'PRIMER', dan mungkin hanya ada satu di atas meja (dan harus selalu ada satu; meskipun beberapa sistem database tidak menegakkan ini). Indeks PRIMARY dimaksudkan sebagai sarana utama untuk mengidentifikasi secara unik setiap baris dalam tabel, jadi tidak seperti UNIQUE, indeks tersebut tidak boleh digunakan pada kolom apa pun yang memungkinkan nilai NULL. Indeks PRIMARY Anda harus berada pada jumlah kolom terkecil yang cukup untuk mengidentifikasi satu baris secara unik. Seringkali, ini hanya satu kolom yang berisi angka kenaikan-otomatis yang unik, tetapi jika ada hal lain yang dapat secara unik mengidentifikasi baris, seperti "kode negara" dalam daftar negara, Anda dapat menggunakannya sebagai gantinya.

    Beberapa sistem basis data (seperti InnoDB MySQL) akan menyimpan catatan tabel pada disk sesuai urutannya dalam indeks PRIMARY.

  • Indeks FULLTEXT berbeda dari semua yang di atas, dan perilaku mereka berbeda secara signifikan antara sistem database. Indeks FULLTEXT hanya berguna untuk pencarian teks lengkap yang dilakukan dengan klausa MATCH () / AGAINST (), tidak seperti tiga di atas - yang biasanya diterapkan secara internal menggunakan b-tree (memungkinkan untuk memilih, menyortir atau rentang mulai dari kolom paling kiri) atau tabel hash (memungkinkan untuk pemilihan mulai dari kolom paling kiri).

    Di mana jenis indeks lainnya adalah untuk tujuan umum, indeks FULLTEXT adalah khusus, karena melayani tujuan yang sempit: itu hanya digunakan untuk fitur "pencarian teks lengkap".

Kesamaan

  • Semua indeks ini mungkin memiliki lebih dari satu kolom di dalamnya.

  • Dengan pengecualian FULLTEXT, urutan kolom penting: agar indeks berguna dalam kueri, kueri harus menggunakan kolom dari indeks mulai dari kiri - tidak dapat menggunakan hanya bagian kedua, ketiga atau keempat dari suatu indeks, kecuali jika itu juga menggunakan kolom sebelumnya dalam indeks untuk mencocokkan nilai statis. (Agar indeks FULLTEXT berguna untuk kueri, kueri harus menggunakan semua kolom indeks.)

thomasrutter
sumber
2
apakah ini berarti indeks FULLTEXT pada dasarnya tidak berguna dan sedikit ruang jika Anda tidak menggunakan MATCH () / AGAINST () di pertanyaan Anda?
user1397417
5
Iya. Ini juga hanya digunakan untuk database MyISAM di MySQL, bukan InnoDB. Server database lain mungkin memiliki fitur yang setara yang dapat bekerja secara berbeda.
thomasrutter
"itu tidak boleh digunakan pada kolom apa pun yang memungkinkan nilai NULL" -> Ini harus "tidak dapat digunakan". Kunci primer tentu saja NOT NULL. MySQL akan melaporkan show columnsbahwa kunci unik non-NULL adalah kunci primer, jika tidak ada kunci primer lain yang ditentukan.
Gordon Linoff
1
Alasannya di sini adalah bahwa NULL dianggap tidak sama dengan dirinya sendiri .. Lol saya tidak akan melupakan ini
Hos Mercury
2
@thomasrutter MySQL mendukung FULLTEXT di InnoDB dari versi 5.6
Marek Skiba
151

Semua ini adalah jenis indeks.

primer: harus unik, adalah indeks, adalah (kemungkinan) indeks fisik, bisa hanya satu per tabel.

unik: seperti yang tertulis. Anda tidak dapat memiliki lebih dari satu baris dengan tupel dari nilai ini. Perhatikan bahwa karena kunci unik dapat lebih dari satu kolom, ini tidak berarti bahwa setiap kolom individu dalam indeks adalah unik, tetapi setiap kombinasi nilai di seluruh kolom ini unik.

index: jika itu bukan primer atau unik, itu tidak membatasi nilai yang dimasukkan ke dalam tabel, tetapi itu memungkinkan mereka untuk dicari lebih efisien.

fulltext: bentuk pengindeksan yang lebih khusus yang memungkinkan pencarian teks lengkap. Anggap saja (pada dasarnya) membuat "indeks" untuk setiap "kata" di kolom yang ditentukan.

tpdi
sumber
32
Primer dapat berupa komposit, yaitu multi-kunci, di MySQL (dan banyak DB lainnya). Itu hanya indeks khusus. Unik bukan benar-benar indeks, ini adalah kendala (yang memang membutuhkan indeks untuk menegakkan dalam jumlah waktu yang wajar, sehingga menciptakan satu).
MBCook
19

Saya merasa seperti ini telah dibahas dengan baik, mungkin kecuali untuk yang berikut:

  • Sederhana KEY/ INDEX(atau disebut juga SECONDARY INDEX) meningkatkan kinerja jika selektivitas cukup. Mengenai hal ini, rekomendasi yang biasa adalah jika jumlah catatan dalam hasil yang ditetapkan di mana indeks diterapkan melebihi 20% dari total jumlah catatan dari tabel induk, maka indeks akan menjadi tidak efektif. Dalam praktiknya masing-masing arsitektur akan berbeda tetapi, idenya masih benar.

  • Indeks Sekunder (dan yang sangat spesifik untuk mysql) tidak boleh dilihat sebagai objek yang sepenuhnya terpisah dan berbeda dari kunci primer. Bahkan, keduanya harus digunakan bersama dan, setelah informasi ini diketahui, memberikan alat tambahan untuk DBA mysql: di Mysql, indeks menanamkan kunci utama. Ini mengarah ke peningkatan kinerja yang signifikan, khususnya ketika secara cerdik membangun indeks penutup implisit seperti yang dijelaskan di sana

  • Jika Anda merasa data Anda seharusnya UNIQUE, gunakan indeks unik. Anda mungkin berpikir itu opsional (misalnya, mengerjakannya di tingkat aplikasi) dan bahwa indeks normal akan melakukannya, tetapi sebenarnya merupakan jaminan untuk Mysql bahwa setiap baris unik, yang secara tidak sengaja memberikan manfaat kinerja.

  • Anda hanya dapat menggunakan FULLTEXT(atau disebut juga SEARCH INDEX) dengan Innodb (Di MySQL 5.6.4 dan lebih tinggi) dan Mesin Myisam

  • Anda hanya dapat menggunakan FULLTEXTpada CHAR, VARCHARdan TEXTjenis kolom
  • FULLTEXTindeks melibatkan BANYAK lebih dari sekadar membuat indeks. Ada banyak tabel sistem yang dibuat, sistem caching yang benar-benar terpisah dan beberapa aturan khusus dan optimasi yang diterapkan. Lihat http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html dan http://dev.mysql.com/doc/refman/5.7/id/innodb-fulltext-index.html
Sebas
sumber