5+ sütunlu birincil anahtar büyük (100 milyon +) tablo için kötü mü?


12

Bazı gerçek hayat DB sorunları hakkında okuyordum ve bir proje 100 milyon satır artı birincil olarak 5 sütun vardı tablo vardı. Bunun kötü olduğunu düşünüyorum, ama kimse bana tam olarak nedenini söyleyebilir mi?

Tablo bir çeşit mikro toplama / birleştirme tablosuydu, bu yüzden 5 sütun gibiydi (gün, pazar_kimliği, ürün_kimliği ...). İlk başta 5 sütunlu bir birincil anahtarın ideal olmadığını düşündüm, ancak ne kadar çok düşündüğümde, bunun neden kötü olduğunu gösteren iyi bir neden bulamadım.

Bu gece yarısı şirket mühendisleriyle tartışıldı. Birisi bunun kötü bir tasarım olduğunu belirtti, üst düzey bir mühendis kabul etti, ama kimse neden bunun için gerçekten atlamadı. Böylece konuyu kendim araştırmaya çalışıyorum!


İdeal olarak, PK'nin nispeten küçük - daha az bellek yükü olmasını istiyorsunuz. 5 sütunlu bir PK ile otomatik olarak en az yaklaşık. 5 INT - bunun yerine 1 INT (auto_increment) yapılabileceği zaman.
Vérace

Yanıtlar:


9

Çok karmaşık birincil anahtarlarda performans sorunları var. Ve daha basit bir birincil anahtar olabileceği gibi çoğaltmaya karşı savunmayabilir.

Ancak, altı ana bileşenden oluşan birincil anahtarlı tabloları sık sık veren bir tasarım deseni vardır. Yıldız şeması olgu tabloları. Yıldız şemasının olgu tablosunda altı boyut varsa, birincil anahtarın altı bileşeni olacaktır. Hiçbir birincil anahtar beyan edilmemiş bir olgu tablosu görmedim ve ETL sürecinin hala oldukça dikkatli bir şekilde yazılması gerekmesine rağmen, genel olarak iyi bir değer olduğunu düşünüyorum.

Bazı raporlama veritabanları, açıkça bu şekilde tasarlanmamış olsa bile yıldız şemasının desenini taklit eder.

100 milyondan fazla satır, özellikle bugünün büyük verileriyle, bir olgu tablosu için aşırı büyük değil.


2

Söz konusu tablo bir toplama / toplama tablosu idi.

O zaman sadece iyi değil, "doğru".

Ve başladığından beri Özet tablosu gibi kokuyor day.

İkincil dizinleriniz var mı? InnoDB kullanıyorsanız, PRIMARY KEY sütunlarının geri kalanının ikincil dizinin sonuna yapıştırılacağını unutmayın. Yine, bu mutlaka bir sorun değildir.

100M satırları bir toplama için çok şey var. Masanın çok ince taneli olduğu anlaşılıyor. Yani, bunun yerine (tarih, a, b, c, d), PK'larla (tarih, a, b, c), (tarih, b, c, d), (tarih, c, d, a), (tarih, d, a, b) (veya bazı uygun kombinasyonlar). Bunu yapıyorum, her biri sadece 10 milyon satır olabilir, böylece raporda daha fazla esnekliğe sahipken raporları daha hızlı hale getirir.

Ya da belki (sadece haftada 14M satırlara yol açan (hafta, a, b, c, d) (Muhtemelen daha fazla.)

Budamayı kolaylaştırmak için PARTITION'ı kullanma - Yüksek hızlı alım --- Veri Ambarı ipuçları --- Özet Tabloları . Bunlar, çeşitli DW projelerinde geliştirdiğim tekniklerin çoğunu özetler. Çıkarım yapabileceğiniz gibi, her proje farklıdır. Özet Tabloların 'tipik' sayısı (tecrübelerime göre) 3-7'dir. Özetlemedeki hedef 10 Gerçek satır -> 1 Özet satırıdır. (Bu bir 'medyan' olabilir.) Nadiren, Özet tablosunu özetledim. Başka bir nadir durumda, bir Özet tablosunu iyi etki gösterecek şekilde BÖLMELİM; Özet tabloları genellikle bir kullanıcı arayüzünden doğrudan erişim için yeterince hızlıdır.


1

Aslında, 5+ sütuna sahip bir PK'ya sahip olmak kendi başına kötü değildir.

PK aynı zamanda kümelenmiş indeks olduğunda, satır tanımlayıcı olarak sayılacağı ve böylece bir NC indeksindeki her bir satıra ekleneceği zaman kötü olur. Bu, gerekli alanı büyük ölçüde artıracaktır.

PK'yi başka bir FK tarafından gerçekten kullandığınızda da kötü olur, çünkü hem mevcut tabloda hem de referansta bulunan 5+ sütunun tüm verilerine sahip olmanız gerekir. Bir kez daha depolama çok artıracak!

Performans açısından akıllıca, bir indeks olarak kullanıldığında kötü olur - sadece tablonun içinde veya bir FK ile birlikte olsun - 5+ sütun içeren daha büyük bir PK Anahtarı daha fazla yer kaplayacağından, daha az giriş olur bir sayfaya sığdırılır ve bu nedenle dizini analiz etmek için daha fazla sayfanın okunması gerekir.

Bununla birlikte, aslında bunu yapmak için her zaman iyi bir neden olabilir, örneğin bir olgu tablosu gibi. Bu nedenle, en iyi cevap aslında çoğu durumda olduğu gibidir: Değişir!

Saygılarımızla Dennis


-2

15 yıldan fazla bir süredir böyle bir anahtara ihtiyacım yok, bazen gördüm ve sadece sorunlara neden oluyordu. Bir sürü sıkıntı var. Her şeyden önce birincil anahtar veri bütünlüğünü korumak içindir ve bunlar sentetik olmalıdır. Gerçek dünyaya bağları olmamalı. Neden ? Gerçek dünya değiştiğinde, herhalde birincil anahtarınız kaybolur ve onu ve ilgili tüm bilgileri güncellemeniz gerekir.

Imagime bu ker hatırlamak gerekir bir tablo yerine başka bir tablo / veritabanı / hizmet birkaç kopyalamak gerekir, ve bazı kopyalamak için unutabilirsiniz. Bunun yerine sysntetic birincil anahtar, sağlamanız gereken tek bir veri parçasıdır. Tartışmanın başka bir büyük başlığı tarafından endeks benzersizliğinden bahsetmiyorum.

Yani kısa özet, sentetik birincil anahtar (otomatik artan, guid, ..) korumak, kopyalamak, basit ...

Bu nedenle, sentetik birincil anahtarı ve bahsettiğiniz 5 sütun için başka bir anahtarı düşünüyorum.

Sonunda, tablo sadece birleştirilmişse ve birisinin anahtarlar ile satırlara başvurması gerekmeyecekse (ancak dünya değişir, bana güven, en azından benim için kalıcı olarak değişir), muhtemelen olduğu gibi bırakacağım (birincil beş sıralı anahtar), ancak eskiden sahip olmamız durumunda, yine de çok fazla soruna neden olur. Size söyledim.

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.