EŞSİZ bir kısıtlama alan (lar) da otomatik olarak bir DİZİN oluşturur mu?


99

Ben Should ayrı bir dizin tanımlamak üzerinde email(arama amaçları için) sütun veya "otomatik" ile birlikte eklenmiş endeksidir UNIQ_EMAIL_USERkısıtlama?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

DÜZENLEME : Corbin tarafından önerildiği gibi EXPLAIN SELECT * FROM customer WHERE email = 'address'boş masada sorgulandım . Sonuç bu, nasıl yorumlayacağımı bilmiyorum:

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

Tabloya bir IXD_EMAIL eklerken aynı sorgu şunu gösterir:

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

1
EŞSİZ bir kısıtlama teknik olarak bir indeks gerektirmez ... ancak standardın onu nasıl tanımladığından veya MySQL'in (hangi arka uç, btw?) Onu nasıl uyguladığından emin olamaz. MySQL'de el ile hızlı bir şekilde bulabildiğim tek şey "UNIQUE indeksi, indeksteki tüm değerlerin farklı olması gerektiği şekilde bir kısıtlama yaratır."

Bireysel ve kapsayan (AKA bileşik - birden fazla sütun) dizinleri uygulamanız ve test etmeniz gerekir. Kullanıma ve verilere bağlıdır.
OMG Ponies

3
Gerçekten bir dizin oluşturduğundan% 99 eminim. Sadece benzersiz bir tablo oluşturun, ardından bir seçimde nerede ile bir açıklama yapın.
Corbin

@Corbin yaptı, sonucu nasıl yorumlamalıyım?
gremo

Benzersiz kısıtlamayı bir dizin olarak mı kullandı? Bu arada önemli ölçüde büyük bir tablo kullanmanız gerekebilir veya sadece bir tablo taraması yapabilir.
Corbin

Yanıtlar:


116

Bir benzersiz anahtar teklik için katma denetimi ile düzenli endeksi gibi davranan, dizinin özel bir durumudur. Kullanarak SHOW INDEXES FROM customer, benzersiz anahtarlarınızın aslında B-ağaç tipi indeksler olduğunu görebilirsiniz.

Bir bileşik endeksi üzerinde (email, user_id)yeterli, yalnızca e-posta üzerine ayrı bir dizin gerekmez - MySQL bir bileşik endeksi en soldaki parçaları kullanabilirsiniz. Bir dizin boyutunun sorgularınızı yavaşlatabileceği bazı sınır durumları olabilir, ancak gerçekten bunlarla karşılaşana kadar endişelenmemelisiniz.

Dizin kullanımını test etmeye gelince, önce tablonuzu bazı verilerle doldurarak optimize edicinin bu dizini kullanmaya değer olduğunu düşünmesini sağlamalısınız.


Yani EXPLAINtest, boş tablo yüzünden yanlış değerler mi gösteriyor?
gremo

Bu açıklama sonucunu nasıl elde ettiğinizden emin değilim, tablo tanımınızı kopyaladım ve aynı açıklama UNIQ_EMAIL_USER'ı olası anahtar olarak gösteriyor, lütfen tekrar kontrol edebilir misiniz?
piotrm

Tamam, numarayı buldum. Kısıtlama user_idönce kullanılarak tanımlandığında ve sonra emailiçinde görünmediğinde EXPLAIN. Bunun farkında mısın?
gremo

12
E-posta, (kullanıcı_kimliği, e-posta) çiftinin en soldaki parçası olmadığı için işe yaramaz. Yalnızca en sağdaki bölümü kullanarak sıranızı bulmak için b-ağacından aşağı inemezsiniz.
piotrm
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.