MySQL tabloları oluştururken PRIMARY, UNIQUE, INDEX ve FULLTEXT arasındaki farklar nelerdir?
Onları nasıl kullanırım?
MySQL tabloları oluştururken PRIMARY, UNIQUE, INDEX ve FULLTEXT arasındaki farklar nelerdir?
Onları nasıl kullanırım?
Yanıtlar:
KEY veya INDEX normal, benzersiz olmayan bir dizine karşılık gelir. Çok endeksi dizin için olmayan ayrı değer, izin verilen olabilir dizin her sütun aynı değerlere sahip satır içerir. Bu dizinler verilerinizde herhangi bir kısıtlama uygulamaz, bu nedenle yalnızca erişim için kullanılır - tüm kayıtları taramadan belirli kayıt aralıklarına hızlı bir şekilde ulaşmak için.
UNIQUE , dizinin tüm satırlarının benzersiz olması gereken bir dizine karşılık gelir. Diğer bir deyişle, aynı satır, bu dizindeki tüm sütunlar için başka bir satırla aynı NULL olmayan değerlere sahip olmayabilir. Belirli kayıt aralıklarına hızlı bir şekilde ulaşmak için kullanılmasının yanı sıra, veritabanı sistemi veri eklenirken veya güncellenirken farklı değerler kuralının kırılmasına izin vermediğinden, UNIQUE dizinleri veriler üzerindeki kısıtlamaları zorlamak için kullanılabilir.
Veritabanı sisteminiz NULL değerlere izin veren sütunlara UNIQUE dizininin uygulanmasına izin verebilir, bu durumda her ikisinin de NULL değer içermesi durumunda iki satırın aynı olmasına izin verilir (buradaki mantık NULL değerinin kendisine eşit olmadığı kabul edilir). Uygulamaya bağlı olarak, ancak, olabilecek bu istenmeyen bulmak: Bunu önlemek istiyorsanız, ilgili sütunlarda NULL değerleri izin vermemeniz gerekir.
PRIMARY , her zaman 'PRIMARY' olarak adlandırılması dışında tam olarak BENZERSİZ bir dizin gibi davranır ve bir tabloda yalnızca bir tane olabilir (ve her zaman bir tane olmalıdır ; ancak bazı veritabanı sistemleri bunu zorlamıyor olsa da). Bir PRIMARY endeksi, tablodaki herhangi bir satırı benzersiz bir şekilde tanımlamak için birincil bir araç olarak tasarlanmıştır, bu nedenle UNIQUE öğesinin aksine, NULL değerlere izin veren sütunlarda kullanılmamalıdır. PRIMARY dizininiz, bir satırı benzersiz şekilde tanımlamak için yeterli olan en az sayıda sütun üzerinde olmalıdır. Genellikle, bu yalnızca otomatik olarak artırılan benzersiz bir sayı içeren bir sütundur, ancak bir ülke listesinde "ülke kodu" gibi bir satırı benzersiz bir şekilde tanımlayabilen başka bir şey varsa, bunun yerine bunu kullanabilirsiniz.
Bazı veritabanı sistemleri (MySQL'in InnoDB'si gibi) tablonun kayıtlarını PRIMARY dizininde göründükleri sırayla diske kaydeder.
FULLTEXT dizinleri yukarıdakilerin hepsinden farklıdır ve davranışları veritabanı sistemleri arasında önemli ölçüde farklılık gösterir. FULLTEXT dizinleri, genellikle yukarıdaki üçten farklı olarak MATCH () / AGAINST () yantümcesiyle yapılan tam metin aramaları için yararlıdır - bunlar genellikle b-ağaçlarını kullanarak dahili olarak uygulanır (en soldaki sütundan başlayarak seçim, sıralama veya aralıkları seçmeye izin verir) veya hash tabloları (en soldaki sütundan başlayarak seçime izin verir).
Diğer dizin türlerinin genel amaçlı olduğu durumlarda, bir FULLTEXT dizini, dar bir amaca hizmet etmesi bakımından uzmanlaşmıştır: yalnızca "tam metin araması" özelliği için kullanılır.
Bu dizinlerin hepsinde birden fazla sütun olabilir.
FULLTEXT hariç, sütun sırası önemlidir: dizinin bir sorguda yararlı olması için, sorgu soldan başlayarak dizinden sütunları kullanmalıdır - bir öğenin yalnızca ikinci, üçüncü veya dördüncü bölümünü kullanamaz statik değerlerle eşleşmek için dizindeki önceki sütunları da kullanmadığı sürece. (Bir FULLTEXT dizininin bir sorgu için yararlı olması için, sorgunun dizinin tüm sütunlarını kullanması gerekir .)
NOT NULL
. MySQL, show columns
tanımlanmış başka birincil anahtar yoksa, NULL olmayan benzersiz bir anahtarın birincil anahtar olduğunu bildirecektir .
Bunların hepsi bir çeşit endeks.
birincil: benzersiz olmalı, bir dizin, fiziksel dizin (büyük olasılıkla), tablo başına yalnızca bir tane olabilir.
benzersiz: söylediği gibi. Bu değerin bir demetiyle birden fazla satıra sahip olamazsınız. Benzersiz bir anahtarın birden fazla sütunun üzerinde olabileceğinden, bunun mutlaka dizindeki her bir sütunun benzersiz olduğu anlamına gelmediğini, ancak bu sütunlardaki her bir değer kombinasyonunun benzersiz olduğu anlamına geldiğini unutmayın.
index: birincil veya benzersiz değilse, tabloya eklenen değerleri kısıtlamaz, ancak daha verimli bir şekilde aranmasına izin verir.
fulltext: tam metin aramasına izin veren daha özel bir indeksleme biçimi. Bunu (esasen) belirtilen sütundaki her "kelime" için bir "dizin" oluşturmayı düşünün.
Bunun iyi bir şekilde ele alındığını hissediyorum, belki aşağıdakiler hariç:
Basit KEY
/ INDEX
(veya başka türlü denir SECONDARY INDEX
), seçicilik yeterliyse performansı artırır. Bu konuda, olağan öneri, bir dizinin uygulandığı sonuç kümesindeki kayıt miktarı, üst tablonun toplam kayıt miktarının% 20'sini aşarsa, dizinin etkisiz olacağıdır. Pratikte her mimari farklı olacaktır, ancak fikir hala doğrudur.
İkincil Dizinler (ve mysql'e çok özeldir) birincil anahtardan tamamen ayrı ve farklı nesneler olarak görülmemelidir. Aslında, her ikisi de birlikte kullanılmalı ve bu bilgiler bilindikten sonra, mysql DBA'ya ek bir araç sağlamalıdır: Mysql'de, dizinler birincil anahtarı gömer. Özellikle , burada açıklandığı gibi örtük örtme dizinleri akıllıca oluştururken önemli performans geliştirmelerine yol açar
Verilerinizin olması gerektiğini düşünüyorsanız UNIQUE
benzersiz bir dizin kullanın. Bunun isteğe bağlı olduğunu düşünebilirsiniz (örneğin, uygulama düzeyinde çalışmak) ve normal bir dizin bunu yapar, ancak aslında Mysql için her satırın benzersiz olduğunu garanti eder ve bu da bir performans avantajı sağlar.
Yalnızca Innodb (MySQL 5.6.4 ve üstü sürümlerde) ve Myisam Motorları ile kullanabilirsiniz FULLTEXT
(veya başka bir şekilde kullanabilirsiniz SEARCH INDEX
)
FULLTEXT
üzerinde CHAR
, VARCHAR
ve TEXT
kolon tipleriFULLTEXT
index, bir dizin oluşturmaktan çok daha fazlasını içerir. Bir grup sistem tablosu oluşturuldu, tamamen ayrı bir önbellek sistemi ve bazı özel kurallar ve optimizasyonlar uygulandı. Bkz. Http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html ve http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
SPATIAL
: stackoverflow.com/questions/2256364/…