SORU
4 AĞUSTOS 2008, PAZARTESİ


Nasıl veritabanı indeksleme çalışır?

İndeksleme veri kümesi boyutu arttıkça çok önemli olduğu göz önüne alındığında, birisi veritabanı agnostik bir düzeyde nasıl çalıştığını açıklayabilir mi?

İndeks sorguları hakkında bilgi için bir alan, http://stackoverflow.com/questions/1156/how-do-i-index-a-database-field check out

CEVAP
4 AĞUSTOS 2008, PAZARTESİ


Bu neden gerekli?

Disk tabanlı veri depolama aygıtı üzerinde depolanan veri blok olarak depolanır. Bu bloklar kendi bütünlüğü içinde, onlara atom disk erişim işlemi yapmadan ulaşabilirsiniz. Disk blokları yapılandırılmış aynı şekilde bağlantılı listeler; her ikisi de içeren bir bölüm için veri, bir işaretçi konumunu bir sonraki düğüm (ya da blok), ve ikisi de lazım değil saklı bitişik.

Nedeniyle aslında bu sayıda kayıtları sadece sıralanmış bir alan, biz Devlet bu arama ile ilgili bir alan değil mi sıralanmış gerektiren bir Doğrusal Arama gerektiren N/2 blok erişir (ortalama), N Sayı blokları masaya yayılmış. Eğer bu alan anahtar olmayan bir alan (yani benzersiz girişlerini içermez) ise daha sonra tüm tablo alanı N blok kere de aranmalıdır.

Sıralanmış bir alan ise, İkili bir Arama olabilir, bu log2 N blok erişir. Ayrıca veri anahtar olmayan bir alan verilen sıralanmış olduğundan, masanın geri kalanı da daha yüksek bir değer bulunursa yinelenen değerleri için aranan, olması gerekmez. Böylece performans artışı önemli.

Dizin nedir?

Dizin oluşturma birden çok alanda kayıtları bir dizi sıralama bir yoludur. Bir tablodaki bir alan üzerinde dizin oluşturma oluşturur alan değeri tutar ve ilgili kaydı başka bir veri yapısı. Bu dizin yapısı, daha sonra, İkili Arama yapılması için izin sıralanır.

Olumsuz dizin bu dizin gerektiren ek alan disk, dizinler, depolanan birlikte bir tablo kullanarak hali hazırda motor, bu dosyayı hızlı ulaşmak boyutunu sınırlar altında yatan dosya sistemi ise pek çok alan içinde aynı tablo endeksli.

Nasıl çalışır?

Birincisi, örnek veritabanı tablo şema tarif edeyim;

Field name       Data type      Size on disk
id (Primary key) Unsigned INT   4 bytes
firstName        Char(50)       50 bytes
lastName         Char(50)       50 bytes
emailAddress     Char(100)      100 bytes

Not: char, varchar yerine disk değeri doğru bir boyut için izin vermek için kullanılmıştır. Bu örnek veritabanı beş milyon satır içerir ve sıralanmayan. Birkaç sorgu performansı analiz edilir. Bu bir sorgu kullanıyorıd(sıralanmış bir anahtar alan) ve kullanarakad(non-anahtar sıralı olmayan bir saha).

Örnek 1

Bize örnek veritabanı r = 5,000,000 kayıtları bir sabit boyutlu veren bir kayıt uzunluğu R = 204 bayt ve onlar saklı bir tablo kullanarak hali hazırda motoru hangisi kullanılarak varsayılan blok boyutu B = 1,024 bayt. Tablo engelleme faktörü disk blok başına bfr = (B/R) = 1024/204 = 5 kayıtları olacaktır. Blok Masa tutmak için gereken sayısı N = (r/bfr) = 5000000/5 = 1,000,000 blok uzaklıktadır.

Kimliği alanında doğrusal bir arama N/2 = 500,000 blok erişir ortalama kimlik alanında önemli bir alan olduğu göz önüne alındığında, bir değer bulmak gerekir. Ama id alanı da sıralanır beri ikili arama log2 1000000 = 19.93 = 20 blok erişir ortalama gerektiren yapılabilir. Anında bu ciddi bir iyileşme olduğunu görüyoruz.

Şimdiadalan ikili bir arama imkansız yani sıralanmış, ne de değerler benzersiz, ve böylece tablo N = 1,000,000 tam blok bir kere için sonuna kadar aramayı gerektirir. Bu dizin doğru amaçlamaktadır bu durum.

Orijinal kaydetmek için bir dizin kaydı tek dizili alan ve bir işaretçi içerir göz önüne alındığında, işaret ettiği çok alanda rekor daha küçük olacağını nedenle duruyor. Dizinin kendisi, bu nedenle daha az blok erişir sokmanın gerektiren özgün tablo, daha az disk blokları gerektirir. Bu dizin için şemaadalan aşağıda belirtilmiştir;

Field name       Data type      Size on disk
firstName        Char(50)       50 bytes
(record pointer) Special        4 bytes

NotMySQL işaretçileri, 2, 3, 4 veya uzunluğu tablo boyutuna bağlı olarak 5 bayt.

Örnek 2

R = 54 bayt ve varsayılan blok kullanarak dizin kayıt uzunluğu r = 5,000,000 kayıtları örnek veri tabanımızda verilen B = 1,024 bayt boyutu. Dizinin engelleme faktörü disk blok başına bfr = (B/R) = 1024/54 = 18 kayıtları olacaktır. Blok Masa tutmak için gereken toplam sayı N = (r/bfr) = 5000000/18 = 277,778 blokları.

Şimdi bir arama kullanarakadalan endeks performansı artırmak için kullanmak. Bu log2 277778 = 18.08 = 19 blok erişir ortalama endeks ikili bir arama için izin verir. Bulmak adresinin gerçek kayıt gerektiren başka bir blok erişmek için okuyun getiren toplam 19 1 = 20 blok erişir, bir far cry dan 277,778 blok erişir tarafından gerekli eklenmemiş masa.

Ne zaman kullanılmalıdır?

Verilen bir dizin oluşturun gerektirir ek disk alanı (277,778 bloklar ekstra yukarıdaki örnek), ve çok sayıda dizin olabilir neden sorunları kaynaklanan dosya sistemi boyutu sınırları, dikkatli düşünce kullanılmalıdır seçmek için doğru alanlar için dizin.

Yana dizin, sadece hızlandırmak için kullanılır arama için eşleşen bir alan içinde kayıtları duruyor sebebi bu dizin alanları için kullanılan tek çıkış olurdu sadece bir atık disk alanı ve işlem süresi ne yapıyor bir ekleme ya da silme işlemi, ve böylece kaçınılmalıdır. Ayrıca ikili bir arama doğası göz önüne alındığında, verilerin önem düzeyi ya da teklik önemlidir. 2 önem taşıyan bir alan üzerinde dizin oluşturma 1.000 önem düzeyi Yaklaşık 1,000 kayıtları döndürmek için ise yarım verileri böl. Böyle bir düşük önem etkinliği azalır bir doğrusal sıralama ve sorgu iyileştiricisi olacak kullanmaktan kaçının Endeksi ise önem az 0 Kayıt numarası etkin hale Endeksi bir işe yaramaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • huyked

    huyked

    28 Mart 2008
  • kylediablo

    kylediablo

    8 Ocak 2007
  • TantalizingTrance

    TantalizingT

    15 ŞUBAT 2009