Apakah kunci utama diindeks secara otomatis di MySQL?

243

Apakah Anda perlu membuat indeks secara eksplisit, atau itu implisit ketika mendefinisikan kunci utama? Apakah jawabannya sama untuk MyISAM dan InnoDB?

Alex Miller
sumber

Jawaban:

294

Kunci utama selalu diindeks. Ini sama untuk MyISAM dan InnoDB, dan umumnya berlaku untuk semua mesin penyimpanan yang mendukung indeks.

Emil H
sumber
5
Jika kunci utama selalu diindeks mengapa orang ketika berbicara tentang arsitektur / kinerja database selalu menyarankan pendatang baru SQL untuk "memastikan database mereka diindeks dengan benar"?
tim peterson
35
@tim: Mereka memberi tahu orang-orang untuk memastikan bahwa kolom lain yang digunakan untuk memfilter, mengelompokkan, atau mengurutkan juga memiliki indeks.
Emil H
15
Jangan lupa bergabung juga! Kolom gabungan yang diindeks mempercepat.
JustJohn
31

Menurut http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html akan terlihat bahwa ini akan menjadi implisit

ist_lion
sumber
1
Saya menemukan tautan itu dengan mencari sebelum mengajukan pertanyaan. Tapi sepertinya itu tidak menyiratkan hal itu atau apa pun tentang pertanyaan ini kepada saya.
Alex Miller
Halaman yang ditautkan dalam jawaban ini tampaknya tidak mengatakan apa-apa tentang apakah kunci utama juga merupakan indeks. Halaman-halaman yang ditautkan dalam jawaban dari @fyrye lebih relevan.
George Hawkins
16

Meskipun ini ditanyakan pada tahun 2009 saya pikir saya akan mengirim referensi aktual ke dokumentasi MySQL pada kunci primer. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

The primary key untuk tabel merupakan kolom atau kumpulan kolom yang Anda gunakan dalam pertanyaan Anda yang paling penting. Ini memiliki indeks terkait, untuk kinerja permintaan yang cepat

Untuk referensi MySQL 5.0, lihat: http://dev.mysql.com/doc/refman/5.0/id/mysql-indexes.html

Sebagian besar indeks MySQL ( PRIMARY KEY , UNIQUE, INDEX, dan FULLTEXT) disimpan dalam B-tree. Pengecualian adalah bahwa indeks pada tipe data spasial menggunakan R-tree, dan bahwa tabel MEMORY juga mendukung indeks hash.

fyrye
sumber
11

Kunci utama diindeks secara implisit untuk MyISAM dan InnoDB. Anda dapat memverifikasi ini dengan menggunakan EXPLAIN pada kueri yang menggunakan kunci utama.

Patrick Gryciuk
sumber
9

Anda tidak harus secara eksplisit membuat indeks untuk kunci utama ... itu dilakukan secara default.

Rick
sumber
8

Saya kira ini jawabannya

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)
tamu
sumber
7

Indeks paling baik digunakan pada kolom yang sering digunakan di mana klausa, dan dalam segala jenis penyortiran, seperti "urutan oleh". Anda mungkin bekerja pada basis data yang lebih kompleks, jadi ada baiknya mengingat beberapa aturan sederhana.

  • Indeks memperlambat sisipan dan pembaruan, jadi Anda ingin menggunakannya dengan hati-hati pada kolom yang SERING diperbarui.
  • Indeks mempercepat tempat klausa dan memesan. Ingatlah untuk memikirkan BAGAIMANA data Anda akan digunakan saat membangun tabel Anda. Ada beberapa hal lain yang perlu diingat. Jika meja Anda sangat kecil, yaitu hanya beberapa karyawan, lebih buruk menggunakan indeks daripada membiarkannya keluar dan membiarkannya melakukan pemindaian tabel.

  • Indeks benar-benar hanya berguna dengan tabel yang memiliki banyak baris.

  • Satu hal yang perlu diingat, yang merupakan con dalam situasi database karyawan kami, adalah bahwa jika kolom adalah panjang variabel, indeks (dan juga sebagian besar MySQL) berkinerja jauh lebih efisien.

  • Jangan lupa bergabung juga! Kolom gabungan yang diindeks mempercepat.

Masood Ul Hassan
sumber
4

Kunci utama selalu diindeks dan unik secara otomatis. Jadi, berhati-hatilah untuk tidak membuat indeks yang berlebihan.

Misalnya, jika Anda membuat tabel seperti itu

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

karena Anda ingin mengindeks kunci utama dan menerapkan batasan keunikan di atasnya, Anda sebenarnya akan membuat tiga indeks foo!

dr_
sumber
0

Orang dapat menganggap kolom kunci primer sebagai kolom indeks lainnya dengan batasan kunci primer yang disertakan.

Dalam sebagian besar kasus penggunaan, kita memerlukan kunci primer, dan kolom / kolom terindeks dalam sebuah tabel, karena permintaan kita ke tabel dapat menyaring baris berdasarkan pada kolom / kolom yang bukan kunci utama, dalam hal ini kita biasanya mengindeks kolom / kolom tersebut demikian juga.

Anshul Sharma
sumber