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
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.
Nasıl veritabanı DAHİLİ olarak çalışır...
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...
Veri bağlama Nasıl çalışır?AngularJS :...
Bit shift (bit-shift) operatörleri ned...