Bir alanı benzersiz yapmak dizine eklenmiş mi?


10

Bir yaparsanız uniquebir alanda kısıtlamasını, ben de bir ölçeklenebilir insert saati almak için o sahada bir dizin yapmak gerekiyor? Yoksa bu benim için yapılıyor (kullandığı dizin herkese açık olmasa bile)

Özellikle, prototipleme için Apache Derby ile çalışıyorum, ancak muhtemelen yarı yakın gelecekte MySQL'e taşıyacağım. Ben de bu konuda bir şeyler söylüyor SQL standardında bir şey olabilir umuyorum.

Bu alanda arama yapmaya asla ihtiyacım olmayacak, bu yüzden işe yaramaz bir indeks yapmamayı tercih ederim. Ama O(n)ekleme zamanımdan ziyade işe yaramaz bir endeksim olmasını tercih ederim .


2
Bildiğim kadarıyla benzersiz bir kısıtlama benzersiz bir dizin kullanılarak uygulanır. Bu soruda bu durumla ilgili bazı görüşler görebilirsiniz: Ne zaman benzersiz bir dizin yerine benzersiz kısıtlama kullanılır?
Marian

@Marian bu bağlantı için teşekkürler. Çok anlayışlıydı.
corsiKa

Yanıtlar:


2

--DÜZENLE--

Orijinal cevabım (aşağıda) muhtemelen sizin için yararlı değildir, çünkü uniquekısıtlama sorununu ele almaz . Diğerlerinin söylediği gibi, bu kısıtlamalar genellikle zımni benzersiz bir dizinle uygulanır. Özel durumlarda bu doğru olmayabilir (örneğin disable novalidateOracle için).

Soru şu olabilir: Bir endeks olmadan benzersizliği uygulamak mümkün müdür? Genel olarak cevap, bazı durumlarda bir Kümelenmiş Dizin , dizin ve tablonun aynı nesne olduğu anlamına gelmez.

--END DÜZENLEME--

"O (n) yerleştirme süresinden ziyade işe yaramaz bir indeks almayı tercih ederim" dediniz, ancak genel olarak veritabanlarında O (n) yerleştirme süresi yoktur. Dikkate alınması gereken iki durum vardır:

  1. Dizin içeren veya içermeyen normal bir tablo:

    Yeni satırlar yığının üstüne dökülür. RDBMS muhtemelen sadece 1 bloğa bakar , bu yüzden sadece O (1) değil, çok küçük O (1).

    Tablonun dizinleri varsa, her satıra bir işaretçi eklenir. Bu genellikle bir O (log (n)) işlemi olacaktır.

  2. Bir tür kümelemenin devam ettiği bir tablo, örneğin Oracle için bir Dizin Organize Tablo veya küme veya SQL Server ve diğerleri için Kümelenmiş Dizin :

    Belirli bir bloğa yeni satırlar eklenir, bu da bloğun bölünmesine veya taşmasına neden olabilir, ancak ne olursa olsun , bloğu bulmak için kullanılan b-ağacı veya benzer yapıdan kaynaklanan hala O (log (n)) veya daha iyidir .


Ama bir endeks olmadan benzersizlik O(n)tüm tabloyu kontrol etmek gibi olacaktır . Bundan kaçınmaya çalışıyorum.
corsiKa

Bu gerçekten bu soru için en iyi cevap !!! +1
RolandoMySQLDBA

@Trick - evet, ilk başta yanlış anladım. Endeks, korktuğum benzersizlik kısıtı için ödediğiniz fiyattır. Durumunuzda bir Kümelenmiş Dizin kullanabilir misiniz?
Jack diyor ki topanswers.xyz

1
@JackPDougless Standart bir "dizin" kullanabilir ve O(lg n)ekleme zamanı alabilirim . Problem değil. Benim sorum, iyi bir ekleme zamanı elde etmek için bu dizine ihtiyacınız olduğunu bilerek sistem benim için bir dizin oluşturmak olacaktır.
corsiKa

2

BİRİNCİL ANAHTAR> = BENZERSİZ> = İNDEKS == ANAHTAR

InnoDB verileri PK tarafından sıralanır. MyISAM PK EŞSİZ ile aynı şekilde hareket eder.

INSERT, sahip olduğunuz her bir dizine (her tür) bir "satır" eklemelidir. Bu biraz zaman alıyor. (Genellikle önemli olan zaman yeterli değildir.) Dizinlerin tümü BTree biçiminde depolanır. MyISAM BTree blokları 1KB; InnoDB 16KB kullanır.

InnoDB'ye yerleştirildiğinde PK ve veriler aynı anda güncellenir.

MyISAM'e ekleme genellikle verileri .MYD'ye "ekler". Ayrı olarak, PK'ye (varsa) bir satır ekler.

INSERT öncelikle herhangi bir PRIMARY veya UNIQUE anahtarı için yinelenen bir anahtar olmadığını doğrulamalıdır. Bu indeks kullanılarak yapılır. Ve bu nedenle, neden EŞSİZ ve YABANCI ANAHTAR SÖZLEŞMELER gerçekten indeks oluşturur. Bu O (logN), ancak genellikle CPU, I / O değil, çünkü etkin önbellekleme.


InnoDB spesifikasyonunda, bir UNIQUEkısıtlamanın kullanıcı yapılacak bir belirleme olmadan bir endeks oluşturacağını belirten bir alıntı var mı?
corsiKa

Hmmm ... Hayır, sadece yılların tecrübesi.
Rick James,

İşte bunu test etmenin bir yolu ... İkincil dizinleri olmayan bir tablo OLUŞTUR; TABLO DURUMUNU GÖSTER - Dizin_uzunluğu 0 olacaktır. Sonra bir BENZERSİZ dizin ekleyin; TABLO DURUMU artık bir şey gösterecek. (
Rick James

1

Soruyu kalın harflerle cevaplamak için: Evet, bir alanı benzersiz yapmak birincil anahtar gibi dizine ekler. Aslında, bunu diğer Benzersiz (Aday) Anahtarlardan ayırt etmek için Kendi Adına Sahip Birincil Anahtarlarla ilgili başka bir soruda tartışmıştım .

Kısıtlamalara gelince, kısıtlama paradigmasının ayarlanması için dizinler sizin için oluşturulur. Yaptığınız kısıtlama, kişisel olarak kısıtlama paradigmasından ayrı olarak yaptığınız diğer UNIQUE anahtarlarına başvurmadığı sürece, yinelenen dizinleri, hatta UNIQUE anahtarlarını bile kaldırabilmelisiniz.

Bu alanı asla aramak zorunda kalmayabilirsiniz, ancak MySQL, anahtarların geçerliliğini belirlemek ve ON DELETE CASCADE ve ON UPDATE CASCADE işlemlerini nasıl gerçekleştireceğinizi belirlemek için yolu olarak kullanmalıdır.

UNIQUE endeksi, masanın her satırında tuple (tek ton, çift, üçlü, ..., n-tuple, vb.) Benzersizliğini garanti eder.

Tablonun olmasını istediğiniz kısıtlama paradigmasını kırmamanız koşuluyla, bu tür yinelenen dizinleri kaldırmak sizin takdirinize kalmıştır.


1
Bu sorumu cevaplamıyor. Benim sorum ekleme zamanı ile ilgili. Benzersiz bir kısıtlamanız varsa, sistem bir eklemeden önce alanın benzersizliğini sağlamalıdır - alanda dizin yoksa, tüm tabloyu ( O(n)) aramak gerekir . Bir dizin varsa, arama çok daha hızlı olacaktır (muhtemelen O(lg n)). Benim sorunum bu. Referans bütünlüğü mekaniğinin farkındayım, sadece performansla ilgili (bu sorunun amaçları için) endişeliyim.
corsiKa
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.