Karakteri vs Tamsayı birincil tuşları


30

Ana varlıkların olası özelliklerini içeren birden fazla arama tablosuna sahip bir veritabanı tasarlıyorum. Otomatik artan bir tamsayı yerine bu arama değerlerini tanımlamak için 4 veya 5 karakterli bir anahtar kullanmayı düşünüyorum, böylece bu öznitelik kimliklerini ana tablolarda sakladığımda rasgele sayılar yerine anlamlı değerler göreceğim.

Bir karakter alanını tamsayı yerine birincil anahtar olarak kullanmanın performans sonuçları nelerdir?

Bu önemliyse MySQL kullanıyorum.

[Düzenle]
Bu arama tablolarında nadiren eklenmiş yeni kayıtlar var. El ile tutulurlar ve karakter tabanlı tuşlar da el ile oluşturulur. İşte bir örnek:

      CUISINES
 ID      Description
-----  --------------
CHNSE  Chinese
ITALN  Italian
MXICN  Mexican

Yanıtlar:


22

Motoruna bağlı. Yaygın bilgelik, okumaların ucuz olduğu, burada birkaç bayt olduğu ve küçük ila orta büyüklükteki bir veritabanının performansını önemli ölçüde etkilemeyeceği yönündedir.

Daha da önemlisi, birincil anahtarı hangi kullanım alanına koyacağınıza bağlıdır. Tamsayılı diziler, kullanımı ve uygulaması basit olma avantajına sahiptir. Ayrıca, serileştirme yönteminin özel bir şekilde uygulanmasına bağlı olarak, çoğu veri tabanı derhal türetmek yerine sabit bir yerde saklandığından, hızlı bir şekilde türetilebilir olma avantajına sahiptir Select max(ID)+1 from foo.

Soru şu: 5 karakterli bir anahtar, size ve uygulamaya nasıl "anlamlı bir değer" sunuyor? Bu değer nasıl oluşturulur ve artan bir seri numarası bulmaktan daha az veya çok zaman alır mı? Bazı tam sayılarda kaydedilmiş önemsiz miktarda alan olmasına rağmen, sistemlerin büyük çoğunluğu bu alan tasarrufunu göz ardı edecektir.

Performans çıkarımı yoktur, karakter düzeninin asla otomatik bir motor olmasını gerektirmediğinden tasarruf edin , çünkü "tuşlarınız" keşfedilemez. Alan adınız için yapay anahtarlarla uğraşmayın ve yalnızca Çince, Japonca ve Tayca'yı anahtar adları olarak kullanın. Herhangi bir olası uygulamada benzersizliği garanti edemeseniz de, kapsamınız dahilinde, bunları korkunç ve zorla 5 karakterli kısaltmalar yerine kullanmak çok daha makul olacaktır. Milyonlarca tülü elde edene kadar önemli bir performans etkisi olmaz.

Alternatif olarak, yalnızca menşe ülkesine göre takip ediyorsanız ve belirli bölgesel mutfaklardan (Kanton, Sichuan, Sicilya, Umbrian, Calabrian, Yucatecan, Oaxacan, vb.) Takip ediyorsanız, her zaman sadece ISO 3166 kodlarını kullanabilirsiniz .

10.000 tarifim varsa, 5 karakter ve 20 karakter arasında bir fark oluşmaya başlamaz mı?

Alan ucuzdur . O zaman belki OLAP işlemleri yaptığınız 10,000,000 yemek tarifinden bahsediyorsunuz. 10k tarifleri ile 150k uzaya bakıyorsunuz.

Fakat yine de buna bağlı. Milyonlarca kaydınız varsa ve bunlara katılıyorsanız, bu kadar önemsiz bir şey için aramayı denormalize etmek mantıklı olur (maddi bir görünüme). Tüm pratik amaçlar için, 5 karakterli bir anahtar ve değişken uzunluklu anahtar arasındaki modern bir makinede bağıl birleştirme verimliliği aynı olacak şekilde benzerdir. Neyse ki, bol miktarda CPU ve bol miktarda disk dünyasında yaşıyoruz. Pis olanlar çok fazla katılır ve sorgu verimsizlik yerine karakter bazında karakteri karşılaştırması. Bununla birlikte, her zaman test et .

Bu seviyedeki P&T işleri, veritabanına bağımlıdır ve genellemeler son derece zordur. Veritabanının iki örnek modelini oluşturun, bunları tahmini kayıt sayılarıyla doldurun, sonra hangisinin daha hızlı olduğunu görün. Deneyimlerime göre, karakter uzunluğu, iyi dizinler, iyi bellek yapılandırmaları ve diğer kritik performans ayarlama öğeleri ile karşılaştırıldığında çok büyük bir fark yaratmıyor.


@ BrianBallsun-Stanton, bu arama tablolarına zarar veren herhangi bir büyük art arda veriye sahipseniz, depolama alanı ucuz değildir (sorgu hızı açısından), çünkü disk okuma hızı, tamamen RAM'de önbelleklenemeyen herhangi bir RDB'deki tıkanıklıktır. Bunu , DB iş zamanının en iyileriyle rekabet edebilecek bir RDB şeması geliştirmeye çalışırken buldum. Tam açıklama, Skyspark ile hiçbir ilişkim yok, çünkü işverenimi çok verimli DB'lerini kullanmak için fazladan ücretlendirmeleri dışında.
ocak

8

Nadiren değiştirilen masa performansında bir sorun olmadığını düşünüyorum. Belki gelecekte tasarımla ilgili sorunların olacak. İş değişikliklerinden dolayı iş verilerini birincil anahtar olarak kullanmamanızı öneririm. Modelinizdeki tabloları "bağlamak" için herhangi bir ek birincil anahtar kullanın. Herhangi bir iş değişikliği, bu tablolarla ilgili olarak etkilemez


3

Asıl soru, DB sorgu performansının uygulamanız için önemli olup olmadığıdır (veri boyutu). Sorgunuz mikrosaniye alıyorsa, bu mikrosaniyelerin birkaçının Inttuşlarını kullanarak kaydetmesi okunabilirlik / bakım cezası anlamına gelmez. Ancak, sorgunuz dakikalar alıyorsa, o dakikalardan bazılarını kaydetmek Intanahtarların acısına değer olabilir .

Aşağıda, tamsayıların size sorgulama zamanından tasarruf edebileceğini düşünüyorum (genel sorgulama zamanınızın yüzdesi olarak), ancak SkySpark kurucuları bunu benden daha iyi açıklayabilir . Tam açıklamada, işverenim SkySpark'a DB'lerini kullanmak için çok para ödüyor ve ben daha iyi / daha hızlı bir şeyler inşa etmeye çalışıyorum.

Arama tablolarınızın herhangi birine bağlantıları (ilişkileri) olan çok sayıda sıralı veriye (günlük dosyaları, zaman serileri, analitikler, metin veya konuşma anonim şirketiniz) sahipseniz, depolama alanının sorgu hızı için @ Ballsun-Stanton'ın ne kadar ucuz alanın $ cinsinden doğru analizi . Çoğu sorgulama süresi (sıralı veriler için) diski okumak için harcandığından , zaman açısından boşluk ucuz değildir (toplam sorgulama süresinin yüzdesi olarak). Bu nedenle, RDB'niz tüm yabancı anahtarları (ilgili kayıtların anahtarları) otomatik olarak ve verimli bir şekilde sıkıştırıp açmadığı sürece, Inther bir bilgi birimi başına disk alanı (ve okuma hızı) açısından en verimli olan tüm anahtarlarınızın olmasını istersiniz. içerik (entropi). MySQL'de FYI MyISAM kısıtlamalar koyarSıkıştırılmış veri satırlarıyla neler yapabileceğinizi (yalnızca okunur). Diğer bir deyişle Otomatik olarak artan tam sayılar , çoğu DB tamsayılı alandaki düşük minimum boyut sınırlaması göz önüne alındığında , teorik olarak mümkün olduğu kadar sıkıştırılmıştır . Ve bu sıkıştırma olmadan geliyor:

  1. sorgulama zamanı sıkıştırma / açma cezası
  2. sorgu zamanı disk okuma cezası
  3. salt okunur veya sıkıştırılmış veri kayıtları veya anahtarlardaki diğer DB kısıtlamaları

Django gibi popüler, verimli ORM'lerin PK'lar için otomatik olarak artan tamsayılara neden olması ve diğer SO sorularının da aynı sonuca varmasının bir nedeni var.

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.