Soru Veritabanı indeksleme nasıl çalışır?
Veri kümenizin boyutu arttıkça indekslemenin o kadar önemli olduğu göz önüne alındığında, birisi dizinlemenin veritabanı-agnostik düzeyde nasıl çalıştığını açıklayabilir mi?
Bir alanı dizine eklemek için sorgular hakkında bilgi almak için, çıkış yapın Bir veritabanı sütununu nasıl endekslerim.
1878
2017-08-04 10:07
Menşei
Cevaplar:
Neden ihtiyaç duyuluyor?
Veri, disk tabanlı depolama aygıtlarında depolandığında, veri blokları olarak depolanır. Bu bloklara bütünüyle erişilir ve bu sayede atomik disk erişim işlemi sağlanır. Disk blokları, bağlantılı listelerle aynı şekilde yapılandırılmıştır; her ikisi de veri için bir bölüm içerir, bir sonraki düğümün (veya bloğun) konumuna işaret eder ve her ikisinin de bitişik olarak saklanmasına gerek yoktur.
Bazı kayıtların yalnızca bir alanda sıralanabilmesi nedeniyle, sıralamayan bir alanın aranmasının gerekli olan bir Doğrusal Arama gerektirdiğini söyleyebiliriz.
N/2 blok erişim (ortalama), nerede
N tablonun yaydığı blok sayısıdır. Bu alan anahtar olmayan bir alan ise (yani benzersiz giriş içermiyorsa), tüm tablo alanında arama yapılmalıdır.
N blok erişir.
Sıralı bir alanla birlikte, bir İkili Arama kullanılabilir;
log2 N blok erişir. Ayrıca, veriler anahtar olmayan bir alan verildiği için sıralandığından, daha yüksek bir değer bulunduğunda tablonun geri kalanı yinelenen değerler için aranmaya ihtiyaç duymaz. Böylece performans artışı önemlidir.
İndeksleme nedir?
Dizin Oluşturma, birden çok alanda bir dizi kaydı ayırmanın bir yoludur. Tablodaki bir alandaki bir indeks oluşturmak, alan değerini tutan başka bir veri yapısı ve bununla ilgili kayda bir işaretçi oluşturur. Bu dizin yapısı daha sonra sıralanır ve Binary Aramalar'ın üzerinde gerçekleştirilmesine izin verir.
Dizinlemenin olumsuz tarafı, dizinlerin bir tabloda MyISAM motorunu kullanarak birlikte depolandığından, bu dizinlerin diskte ek alan gerektirmesidir, bu dosya aynı tablo içindeki birçok alanın dizine eklenmesi durumunda temel dosya sisteminin boyut sınırlarına hızla erişebilir .
O nasıl çalışır?
Öncelikle örnek bir veritabanı tablosu şemasını çizelim;
Alan adı Veri türü Diskte boyut
kimlik (Birincil anahtar) İmzasız INT 4 bayt
firstName Char (50) 50 bayt
lastName Char (50) 50 bayt
emailAddress Char (100) 100 bayt
Not: disk değerinde doğru bir boyut sağlamak için varchar yerine char kullanıldı.
Bu örnek veritabanı beş milyon satır içerir ve dizine eklenmez. Birkaç sorgunun performansı şimdi analiz edilecektir. Bunlar bir sorgu kullanarak İD (sıralanan bir anahtar alan) ve İsim (anahtarlanmamış bir alan).
örnek 1 - sıralanmamış alanlara göre sıralanmış
Bizim örnek veritabanı göz önüne alındığında
r = 5,000,000 kayıt uzunluğu veren sabit bir büyüklükte kayıtlar
R = 204 baytlar ve varsayılan blok boyutunu kullanan MyISAM motorunu kullanarak bir tabloda depolanırlar.
B = 1,024bayt. Tablonun bloke edici faktörü
bfr = (B/R) = 1024/204 = 5 disk bloğu başına kayıtlar. Tabloyu tutmak için gereken toplam blok sayısı
N = (r/bfr) = 5000000/5 = 1,000,000 blokları.
Kimlik alanında doğrusal bir arama, ortalama bir
N/2 = 500,000 id alanının bir anahtar alan olduğu düşünüldüğünde bir değer bulmak için blokları engeller. Ancak kimlik alanı da sıralandığı için, ortalama bir arama gerektiren bir ikili arama gerçekleştirilebilir.
log2 1000000 = 19.93 = 20 blok erişir. Anında, bunun büyük bir gelişme olduğunu görebiliriz.
Şimdi İsim alan ne sıralanır ne de bir anahtar alan, bu yüzden ikili bir arama imkansızdır, ne de değerler benzersizdir ve bu nedenle tablonun tam olarak aranması gerekir.
N = 1,000,000 blok erişir. Dizinlemenin düzeltmeyi amaçladığı durum budur.
Bir indeks kaydının sadece indekslenmiş alan ve orijinal kayda bir işaretçi içerdiği düşünüldüğünde, bunun işaret ettiği çok alanlı kayıttan daha küçük olması anlamına gelir. Dolayısıyla, indeksin kendisi orijinal tablodan daha az disk bloğu gerektirir; bu nedenle, yineleme için daha az blok erişimi gerektirir. Bir dizinin şeması İsim alan aşağıda özetlenmiştir;
Alan adı Veri türü Diskte boyut
firstName Char (50) 50 bayt
(Kayıt işaretçisi) Özel 4 bayt
Not: MySQL'deki işaretçiler, tablonun boyutuna bağlı olarak 2, 3, 4 veya 5 bayt uzunluğundadır.
Örnek 2 - indeksleme
Bizim örnek veritabanı göz önüne alındığında
r = 5,000,000 bir endeks kayıt uzunluğu ile kayıtlar
R = 54 baytlar ve varsayılan blok boyutunu kullanma
B = 1,024 bayt. Endeksin bloke edici faktörü
bfr = (B/R) = 1024/54 = 18 disk bloğu başına kayıtlar. Dizini tutmak için gereken toplam blok sayısı
N = (r/bfr) = 5000000/18 = 277,778 blokları.
Şimdi kullanarak bir arama İsim alan, performansı artırmak için endeksi kullanabilir. Bu, indeksin ortalama ile bir ikili aramasına izin verir.
log2 277778 = 18.08 = 19 blok erişir. Okunacak daha fazla blok erişimi gerektiren asıl kaydın adresini bulmak için
19 + 1 = 20 blok girişleri, bulmak için gereken 1.000.000 blok erişimden çok uzak İsim Dizine eklenmemiş tabloda eşleşir.
Ne zaman kullanılmalıdır?
Bir dizin oluşturulmasının ek disk alanı gerektirdiği göz önüne alındığında (yukarıdaki örnekten fazla 277,778 blok,% ~ 28'lik bir artış) ve çok fazla sayıda dizin dosya sistemi boyut sınırlarından kaynaklanan sorunlara neden olabilir, doğru seçimi yapmak için dikkatli bir düşünce kullanılmalıdır. endekslenecek alanlar.
Dizinler yalnızca kayıtlar içinde eşleşen bir alanı aramayı hızlandırmak için kullanıldığından, yalnızca çıktı için kullanılan indeksleme alanlarının bir ekleme veya silme işlemi yaparken sadece disk alanı kaybı ve işlem süresi kaybı anlamına gelir. kaçınılmalıdır. İkili bir aramanın doğası da göz önüne alındığında, verilerin asallığı veya tekliği önemlidir. Kardinalliği 2 olan bir alanda indeksleme, verileri yarıya bölerken, 1000'lik bir asaletme yaklaşık 1000 kayıt döndürdü. Böyle düşük bir otorite ile, etkinlik doğrusal bir düzeye indirgenir ve sorgu eniyileyici, endeksin rekor sayının% 30'undan daha az olması durumunda indeksin kullanılmasını engeller, bu da indeksin alan boşluğunu yaratır.
2852
2017-08-04 10:41
İlk okuduğumda bana çok yardımcı oldu. Teşekkür ederim.
O zamandan beri indeksleri oluşturma konusunda bir miktar fikir kazandım:
eğer bir masaya yazarsanız (
UPDATE veya
INSERT) bir endeksle, aslında dosya sisteminde iki yazma işlemi var. Tablo verileri için bir diğeri ise indeks verisi için (ve buna başvurulduğunda (ve - eğer kümelenmişse - tablo verilerinin kullanılması)). Tablo ve dizin aynı sabit diskte bulunuyorsa, bu daha fazla zamana mal olur. Böylece bir endeks (yığın) olmayan bir tablo, daha hızlı yazma işlemlerine izin verir. (eğer iki endeksiniz varsa, üç yazma işlemi ile sonuçlanırsınız, vb.)
Ancak, indeks verileri ve tablo verileri için iki farklı sabit disk üzerinde iki farklı konum tanımlamak, zamanın artan maliyetini azaltabilir / ortadan kaldırabilir. Bu, istenen dosyalara göre istenen dosya gruplarının tanımlanmasını ve istenen şekilde tablo / dizin konumunun tanımlanmasını gerektirir.
İndekslerle ilgili bir başka problem, veri eklendikçe zaman içinde parçalanmasıdır.
REORGANIZE yardımcı olur, bunu yapmak için rutinleri yazmalısınız.
Bazı senaryolarda, bir yığın, dizinli bir tablodan daha yararlıdır.
Örneğin: - Çok sayıda rakip yazışmanız varsa, ancak yalnızca bir gece raporlamak için iş saatlerinin dışında okuyabilirsiniz.
Ayrıca, kümelenmiş ve kümelenmemiş dizinler arasındaki bir ayrım daha önemlidir.
Bana yardımcı oldu:- Kümelenmiş ve Kümelenmemiş dizin aslında ne anlama geliyor?
176
2018-04-30 14:31
Bir indeks, bir veritabanındaki belirli bir sütun için aramayı daha hızlı yapan bir veri yapısıdır. Bu yapı genellikle bir b-ağacı veya bir hash tablosudur, ancak başka bir mantıksal yapı olabilir.
Daha fazla bilgi için şunları tavsiye ederim: Veritabanı dizinleri nasıl çalışır? Ve, dizinler nasıl yardımcı olur?
131
2018-02-20 14:40
Şimdi, "Abc" adlı çalışanların tüm ayrıntılarını bulmak için bir sorgu çalıştırmak istediğimizi varsayalım.
SELECT * FROM Employee
WHERE Employee_Name = 'Abc'
Bir endeks olmadan ne olur?
Veritabanı yazılımı, bu satırdaki Employee_Name öğesinin "Abc" olup olmadığını görmek için tam anlamıyla Çalışan tablosundaki her bir satıra bakmalıdır. Ve, her satırın içinde ‘Abc’ adıyla olmasını istediğimizden, sadece bir satır ‘Abc’ ismiyle bir kez bulduktan sonra duramayız, çünkü isimle başka satırlar da olabilir ABC. Yani, son sıraya kadar her satır aranmalıdır - yani bu senaryodaki binlerce satır, "Abc" ismiyle satırları bulmak için veri tabanı tarafından incelenmelidir. Bu bir denir tam tablo taraması
Bir veritabanı dizini performansa nasıl yardımcı olabilir?
Bir endekse sahip olmanın bütün noktası, incelenecek bir tablodaki kayıtların / satırların sayısını büyük ölçüde azaltarak arama sorgularını hızlandırmaktır. Bir indeks, bir tabloda belirli bir sütunun değerlerini saklayan bir veri yapısıdır (çoğunlukla bir B-ağacı).
B-ağaçları endeksi nasıl çalışır?
B-ağaçlarının indeksler için en popüler veri yapısı olmasının nedeni, zaman açısından verimli olmalarıdır - çünkü aramalar, silmeler ve eklemeler logaritmik zamanda yapılabilir. Ve B-ağaçlarının daha yaygın olarak kullanıldığı bir başka ana neden, B-ağacında saklanan verilerin sıralanabilmesidir. RDBMS, tipik olarak, bir dizin için hangi veri yapısının fiilen kullanıldığını belirler. Ancak, bazı RDBMS'lere sahip bazı senaryolarda, aslında dizinin kendisini oluştururken veritabanınızın kullanmasını istediğiniz veri yapısını belirtebilirsiniz.
Bir karma tablosu endeksi nasıl çalışır?
Hash indekslerinin kullanılmasının nedeni, hash tablolarının sadece değerlere bakıldığında son derece etkili olmasıdır. Dolayısıyla, eşitliği bir dizeyle karşılaştıran sorgular, bir karma dizini kullanırlarsa değerleri çok hızlı alabilir.
Örneğin, daha önce tartıştığımız sorgu, Employee_Name sütununda oluşturulan bir karma dizinden yararlanabilir. Bir karma dizinin işleyiş biçimi, sütun değerinin, hash tablosuna anahtar olması ve bu anahtarla eşlenen gerçek değerin, tablodaki satır verilerine bir gösterici olmasıdır. Bir karma tablosu temel olarak bir ilişkilendirici dizi olduğundan, tipik bir giriş, "Abc => 0x28939" gibi bir şeye benzeyecektir; burada 0x28939, Abc'nin bellekte depolandığı tablo sırasına bir başvurudır. Bir hash tablosu dizininde “Abc” gibi bir değere bakmak ve bellekteki sıraya bir başvuru geri almak, Employee_Name sütununda “Abc” değeri olan tüm satırları bulmak için tabloyu taramaktan çok daha hızlıdır.
Bir karma dizinin dezavantajları
Karma tablolar, veri yapıları sıralanmaz ve karma indekslerin bile yardımcı olamayacağı birçok sorgu türü vardır. Örneğin, 40 yaşın altında olan tüm çalışanları öğrenmek istediğinizi varsayalım. Bunu bir karma tablo endeksi ile nasıl yapabildin? Eh, bir karma tablo sadece anahtar değer çiftleri aramak için iyi çünkü bu mümkün değildir, yani eşitlik kontrol sorguları anlamına gelir
Bir veritabanı dizininin içinde tam olarak ne var?
Yani, artık bir tablodaki bir sütun üzerinde bir veritabanı dizininin yaratıldığını ve indeksin bu belirli sütundaki değerleri sakladığını biliyorsunuz. Ancak, bir veritabanı dizininin değerleri aynı tablonun diğer sütunlarında sakladığını anlamak önemlidir. Örneğin, Employee_Name sütununda bir dizin oluşturursak, bu Employee_Age ve Employee_Address sütun değerlerinin de dizinde saklanmadığı anlamına gelir. Dizindeki diğer tüm sütunları depoladığımızda, tüm masanın başka bir kopyasını oluşturmak gibi olurdu - bu da çok fazla yer kaplar ve çok verimsiz olur.
Bir veritabanı bir endeksi ne zaman kullanacağını nasıl biliyor?
"SELECT * FROM Çalışan WHERE Employee_Name =‘ Abc "gibi bir sorgu çalıştırıldığında, veritabanı sorgulanacak sütun (lar) üzerinde bir dizin olup olmadığını kontrol eder. Employee_Name sütununda bir dizin oluşturulduğunu varsayarsak, veritabanı, aranan değerleri bulmak için dizini kullanmanın gerçekten mantıklı olup olmayacağına karar vermek zorunda kalır - çünkü veritabanı dizinini kullanmak için aslında daha az verimli olduğu bazı senaryolar vardır ve tüm tabloyu taramak için daha verimli.
Bir veritabanı dizinine sahip olmanın maliyeti nedir?
Bu yer kaplar - ve masanız ne kadar büyükse, indeksiniz o kadar büyük olur. Dizinler ile gerçekleştirilen bir başka performans da, karşılık gelen tabloda satır eklediğinizde, sildiğinizde veya güncelleştirdiğinizde, aynı işlemlerin dizininize yapılması gerektiğidir. Endeksin, endeksin kapsadığı tablo sütunlarında ne varsa olduğu gibi, dakika verilerine kadar aynı şeyi içermesi gerektiğini unutmayın.
Genel kural olarak, bir endeks sadece endeksli sütundaki verilerin sık sık sorgulanacağı bir tabloda oluşturulmalıdır.
Ayrıca bakınız
- Hangi sütunlar genellikle iyi endeksler oluşturur?
- Veritabanı dizinleri nasıl çalışır?
94
2017-08-13 18:36
Klasik örnek "Kitaplarda İndeks"
100 sayfalık bölünmüş, 1000 sayfadan oluşan bir "Kitap" düşünün.
Basit mi?
Şimdi, bir dizin sayfası olmadan, "S" harfi ile başlayan belirli bir bölüm bulmak için, tüm kitap taramaktan başka bir seçeneğiniz yoktur. yani: 1000 sayfa
Ama başlangıçta bir dizin sayfası ile oradasınız. Ve daha önemlisi, önemli olan herhangi bir bölümü okumak için, her seferinde tekrar tekrar dizin sayfasına bakmanız gerekir. Eşleşen indeksi bulduktan sonra diğer bölümleri atlayarak etkin bir şekilde bölüme atlayabilirsiniz.
Ama sonra, 1000 sayfaya ek olarak, indeks sayfasını görüntülemek için başka bir 10 sayfaya ihtiyacınız olacak, yani toplam 1010 sayfa.
Bu nedenle, indeks, dizinlenmiş sütun + işaretçi değerlerini, verimli aramalar için sıralanmış sırayla dizinlenmiş satıra depolayan ayrı bir bölümdür.
Okullarda işler basit, değil mi? : P
86
2018-04-23 14:43
Basit Açıklama !!!!!!!!!!
Dizin, bir tablodaki belirli bir sütunun değerlerini saklayan bir veri yapısından başka bir şey değildir. Bir tablonun bir sütununda bir dizin oluşturulur.
Örneğin, Üç sütunlu Kullanıcı adı verilen bir veritabanı tablosu var - Ad, Yaş ve Adres. Kullanıcı tablosunun binlerce satır olduğunu varsayalım.
Şimdi, "John" olarak adlandırılan kullanıcıların tüm ayrıntılarını bulmak için bir sorgu çalıştırmak istediğimizi varsayalım.
Aşağıdaki sorguyu çalıştırırsak.
SELECT * FROM User
WHERE Name = 'John'
Veritabanı yazılımı, bu satırın Adının "John" olup olmadığını görmek için, Kullanıcı tablosundaki her bir satıra bakmak zorundadır. Bu uzun zaman alacaktır.
Burada dizin, "indeks, incelenecek bir tablodaki kayıtların / satırların sayısını büyük ölçüde azaltarak arama sorgularını hızlandırmak için kullanıldığında" yardımcı olur.
Bir dizin nasıl oluşturulur
CREATE INDEX name_index
ON User (Name)
Bir indeks bir tablodaki sütun değerlerinden (Örn: Yuhanna) oluşur ve bu değerler bir veri yapısında saklanır.
Şimdi veritabanı John adında çalışanlar bulmak için endeksi kullanacak çünkü dizin muhtemelen kullanıcılar tarafından alfabetik olarak sıralanacaktır. Ve, sıralandığı için, bir ismin aranması çok daha hızlıdır çünkü “J” ile başlayan tüm isimler indekste yan yana olacaklardır!
47
2017-08-02 01:30
Sadece hızlı bir öneri .. Ek endeksleme ve depolama alanı endeksleme maliyetleri olarak, bu yüzden uygulamanız daha fazla ekleme / güncelleme işlemi gerektiriyorsa, tabloları dizinsiz kullanmak isteyebilirsiniz, ancak daha fazla veri alma işlemi gerektiriyorsa, endekslenmeli tablo.
21
2018-01-14 06:44
Veritabanı İndeksini bir kitabın Dizini olarak düşünün.
Köpeklerle ilgili bir kitabınız varsa ve diyelim ki, Alman Çobanları hakkında bir bilgi bulmak istiyorsanız, elbette kitabın tüm sayfalarını çevirebilir ve aradığınızı bulabilirsiniz. Ancak bu elbette zaman alıcıdır ve çok fazla değildir. hızlı. Diğer bir seçenek ise, kitabın Dizin bölümüne gidip, aradığınız şeyi (bu örnekte Alman Çobanları) adını kullanarak aradığınızı bulmanız ve ayrıca sayfa numarasına bakmanızdır. aradığınızı hızlıca bulabilirsiniz. Veritabanı'nda, sayfa numarası, veritabanını, varlığın bulunduğu diskteki adrese yönlendiren bir işaretçi olarak adlandırılır. Aynı Alman Çoban benzetmesini kullanarak, böyle bir şey ("Alman Çoban", 0x77129) olabilir, burada 0x77129 Alman Çoban için satır verilerinin saklandığı diskteki adrestir.
Kısaca, bir indeks, sorgu aramasını hızlandırmak için bir tabloda belirli bir sütunun değerlerini saklayan bir veri yapısıdır.
16
2017-12-21 17:16
SQL dizini, SQL veritabanında arama hızlandırmak için ilgili bir şeydir. Index, programcının veri tabanından veriyi çok hızlı almasına izin verir. Bir öğrenci veya kitap okuyucu olduğunuzu varsayalım. Kitabınız 50.000 sayfa içeriyor. Ertesi gün “ABC” bir sonraki gün okuyorsunuz, “xyz” başka bir konu okumak istersiniz. Asla sayfadan manüel olarak hiç bir sayfaya gitmeyeceksiniz. Bu durumda yapacağınız şey, belirli bir konuya bakmak için Kitap dizini kullanmak ve sonra doğrudan konuya atlamaktır. Index, arama konusuna zaman ayırdı. SQL dizininde de aynı olan Index, milyonlarca kaydın veritabanından çok hızlı bir şekilde aranmasını sağlar.
10
2018-02-15 10:17
Bir veri tabanı indeksi, veri tabanı yapısını korumak için ek yazma ve depolama alanı maliyetinde bir veritabanı tablosundaki veri alma işlemlerinin hızını artıran bir veri yapısıdır. Dizinler, her veritabanı tablosuna her erişildiğinde, her satırda bir veritabanında arama yapmak zorunda kalmadan verileri bulmak için kullanılır. Dizinler, hem hızlı rastgele aramaların hem de sıralı kayıtların verimli erişiminin temelini sağlayan bir veritabanı tablosunun bir veya daha fazla sütunu kullanılarak oluşturulabilir.
1
2017-07-09 05:33