Birincil anahtar otomatik olarak MySQL'de dizine ekleniyor mu?


243

Açıkça bir dizin oluşturmanız gerekiyor mu yoksa birincil anahtarı tanımlarken örtük mü? Cevap MyISAM ve InnoDB için aynı mıdır?

Yanıtlar:


294

Birincil anahtar her zaman dizine eklenir. Bu MyISAM ve InnoDB için aynıdır ve genellikle endeksleri destekleyen tüm depolama motorları için geçerlidir.


5
Birincil anahtar her zaman dizine eklenirse, neden veritabanı mimarisi / performansı hakkında konuşurken SQL yeni gelenlere her zaman "veritabanlarının doğru şekilde dizine eklendiğinden emin olmalarını" önerir?
tim peterson

35
@tim: İnsanlara, filtreleme, gruplama veya sıralama için kullanılan diğer sütunların da dizinler olduğundan emin olmalarını söylüyorlar.
Emil H

15
Siz de katılmayı unutmayın! Dizine eklenen birleştirme alanları işleri hızlandırır.
JustJohn

31

1
Soruyu sormadan önce arayarak bu bağlantıyı buldum. Ama bana öyle ya da bu soru hakkında başka bir şey ima etmiyor gibi görünüyor.
Alex Miller

Bu yanıtta bağlantısı verilen sayfa, birincil anahtarın da bir dizin olup olmadığı hakkında bir şey söylemiyor gibi görünüyor. @Fyrye tarafından verilen yanıtta bağlantısı verilen sayfalar daha alakalı.
George Hawkins

16

Bu 2009 yılında sorulmuş olsa da, birincil anahtarlar üzerinde MySQL belgelerine gerçek bir referans yayınlamak düşündüm. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

Birincil anahtar bir tablo için size en hayati sorguları kullandıkları sütun sütun veya kümesini temsil eder. Hızlı sorgu performansı için ilişkili bir dizini vardır

MySQL 5.0 referansı için bakınız: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Çoğu MySQL indeksi ( PRIMARY KEY , UNIQUE, INDEX ve FULLTEXT) B ağaçlarında saklanır. İstisnalar, uzamsal veri türlerindeki dizinlerin R ağaçlarını kullanması ve MEMORY tablolarının karma dizinlerini de desteklemesidir.


11

Birincil anahtar, hem MyISAM hem de InnoDB için örtük olarak dizine eklenir. Birincil anahtarı kullanan bir sorguda EXPLAIN kullanarak bunu doğrulayabilirsiniz.


9

Birincil anahtar için açıkça bir dizin oluşturmanıza gerek yoktur ... varsayılan olarak yapılır.


8

Sanırım cevap bu

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)

7

Dizinler en iyi şekilde, yan tümceciklerde ve "sıralama ölçütü" gibi her türlü sıralamada sık kullanılan sütunlarda kullanılır. Daha karmaşık bir veritabanı üzerinde çalışıyor olabilirsiniz, bu nedenle birkaç basit kuralı hatırlamak iyidir.

  • Dizinler ekleri ve güncellemeleri yavaşlatır;
  • Endeksler cümleleri ve sıralamayı göre hızlandırır. Tablolarınızı oluştururken verilerinizin NASIL kullanılacağını düşünmeyi unutmayın. Hatırlanması gereken birkaç şey daha var. Tablonuz çok küçükse, yani sadece birkaç çalışan varsa, bir dizini kullanmak, dizini dışarıda bırakmak ve bir tablo taraması yapmasına izin vermekten daha kötüdür.

  • Dizinler gerçekten yalnızca çok sayıda satırı olan tablolarla kullanışlıdır.

  • Hatırlanması gereken bir diğer şey, çalışanımızın veritabanının durumundaki bir konudur, sütun değişken bir uzunluksa, dizinlerin (ve MySQL'in çoğunun yanı sıra) çok daha az verimli çalışmasıdır.

  • Siz de katılmayı unutmayın! Dizine eklenen birleştirme alanları işleri hızlandırır.


4

Birincil anahtar her zaman otomatik olarak dizine eklenir ve benzersizdir. Bu nedenle, gereksiz dizinler oluşturmamaya dikkat edin.

Örneğin, böyle bir tablo oluşturduysanız

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

Birincil anahtarı dizine eklemek ve üzerinde benzersiz bir kısıtlama uygulamak istediğiniz için, aslında üzerinde üç dizin oluşturursunuz foo!


0

Birincil anahtar sütunu, birincil anahtarın getirdiği kısıtlı diğer dizinlenmiş sütunlar olarak düşünebilir.

Kullanım örneklerinin çoğunda hem birincil anahtara hem de dizinlenmiş sütun / sütunlara ihtiyacımız vardır, çünkü tabloya yapılan sorgularımız satırları birincil anahtar olmayan sütun / sütunlara göre filtreleyebilir, bu durumda genellikle bu sütun / sütunları dizine ekleriz de.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.