Veritabanı indeksleme nasıl çalışır?

oy
1k

Olduğu göz önüne alındığında indexing, veri büyüklüğü artar belirtildiği gibi bu kadar önemli, birisi bir de indeksleme çalışır nasıl açıklayabilir database-agnosticdüzeyde?

Endeksi bir saha için sorgular hakkında bilgi için, check out I endeksi bir veritabanı sütun yapmak nasıl .

Oluştur 04/08/2008 saat 11:07
kaynak kullanıcı
Diğer dillerde...                            


10 cevaplar

oy
2k

Neden gereklidir?

Veri disk tabanlı depolama aygıtları depolanır, bu veri blokları olarak depolanır. Bu bloklar onları atomik disk erişimi operasyon yapma kendi bütünlükleri içerisinde erişilir. Disk blokları bağlantılı listeler gibi aynı şekilde yapılandırılmıştır; Her iki veri için bir bölüm, bir sonraki düğüme (veya engellemek) yerini gösteren bir işaretçi içerir ve her ikisi de bitişik olarak muhafaza edilmesi gerekmez.

Kayıtların bir numara sadece bir alanda sıralanabilir gerçeği nedeniyle, sıralanmamıştır bir alanda arama gerektiren bir Doğrusal Arama gerektirdiğini ifade edebiliriz N/2(ortalama) blok erişimler, nerede Nblok sayısı olduğunu masa yayılmıştır. Bu alan dışı bir anahtar alanı daha sonra tüm tablo aranmalıdır (yani benzersiz girişleri içermiyor) ise Nblok erişir.

Sıralanmış alanıyla Oysa bir ikili Arama olan, kullanılabilir log2 Nblok erişir. Veri olmayan bir anahtar alanını verilmiş dizilmistir beri Ayrıca, tablonun geri kalanı daha yüksek bir değer bulunduğunda, yinelenen değerler için aranacak gerekmez. Böylece performans artışı önemli.

indeksleme nedir?

Dizin birden çok alanda kayıtların bir dizi sıralama bir yoludur. Bir tablodaki bir alan üzerinde bir indeks oluşturma alanı değerini tutan bir veri yapısı oluşturur ve kayıt için bir işaretçiyi de ilgilidir. Bu indeks yapısı daha sonra İkili aramalar üzerine yapılması için izin sıralanır.

endeksleme için olumsuz endeksleri MyISAM motorunu kullanarak bir tabloda birlikte depolanmaktadır beri bu endeksler diskte ek alan gerektirir yani, hızla altta yatan dosya sisteminin boyutu sınırlarını ulaşabilir bu dosyayı aynı tablo içinde çok dalda endeksli olup olmadığını .

O nasıl çalışır?

Birincisi, en örnek bir veritabanı tablosu şemasını ana hatlarıyla izin;

diskte Alan adı Veri türü Boyut
id (Birincil anahtar) İşaretsiz INT 4 bayt
firstName Char (50), 50 bayt
velastName Char (50), 50 bayt
emailAddress Char (100) 100 bayt

Not : karakter diski değerine doğru bir boyutu olanak sağlamak için varchar yerine kullanılmıştır. Bu örnek veritabanı beş milyon satır içerir ve Sıralanmayan olduğunu. Birkaç sorgu performansı şimdi analiz edilecektir. Bu kullanarak sorgu olan kimliği kullanarak, (a kriteri Anahtar alan) ve bir firstName (bir anahtar olmayan sıralanmamış alan).

Örnek 1 - sıralanmamış alanlar vs sıralanmış

Bizim örnek veritabanı Verilen r = 5,000,000rekor uzunluğunu veren sabit bir boyutta kayıtları R = 204bayt ve varsayılan blok boyutu kullanan MyISAM motorunu kullanarak bir tablo saklanır B = 1,024bayt. Tablonun engelleme faktör olacaktır bfr = (B/R) = 1024/204 = 5Disk blok başına kayıtlar. Tablo tutmak için gerekli olan toplam blok sayısı N = (r/bfr) = 5000000/5 = 1,000,000blok.

Ortalama gerektirecektir kimliği alanı üzerinde doğrusal bir arama N/2 = 500,000bloğu kimliği alan bir anahtar alanı olduğu göz önüne alındığında bir değeri bulmak erişir. Id alanı da sıralanır Fakat, bir ikili arama ortalama gerektiren yapılabilir log2 1000000 = 19.93 = 20blok erişir. Anında bu köklü bir iyileşme olduğunu görebiliriz.

Şimdi firstName alanı sıralı ne de bir anahtar alanı ne, yani bir ikili arama imkansızdır, ne değerlerinin benzersiz olup ve bu nedenle tablo tam için sonuna aramaya gerektirecektir N = 1,000,000blok erişir. Endeksleme düzeltmek hedeflediğini de bu durumdur.

Bir dizin kayıt sadece endeksli alan ve orijinal kaydına bir işaretçi içerdiğini göz önüne alındığında, bunun işaret çoklu alan rekor daha küçük olacağını nedenle duruyor. Yani endeks kendisi nedenle daha az blok yinelemenize erişir gerektirir orijinal tabloda, daha az disk bloklarının gerektirir. Bir dizin için şema firstName alanının altında özetlenmiştir;

diskte Alan adı Veri türü Boyut
firstName Char (50), 50 bayt
(Kayıt işareti) Özel 4 bayt

Not : MySQL işaretçiler tablo boyutuna bağlı olarak uzunluğu 2, 3, 4 ya da 5 bayt.

Örnek 2 - indeksleme

Bizim örnek veritabanını Verilen r = 5,000,000bir dizin kayıt uzunluğu ile kayıtları R = 54bayt ve varsayılan blok boyutu kullanarak B = 1,024bayt. Indeksi engelleme faktör olacaktır bfr = (B/R) = 1024/54 = 18Disk blok başına kayıtlar. Endeksini tutmak için gerekli blokların toplam sayısıdır N = (r/bfr) = 5000000/18 = 277,778blokları.

Şimdi kullanarak bir arama firstName alanı performansını artırmak için dizini yararlanabilirler. Bu ortalama ile dizinin bir ikili arama için izin verir log2 277778 = 18.08 = 19blok erişimlerin. Toplam getirerek, okumak için bir başka blok erişimi gerektirir gerçek kaydın, adresini bulmak için 19 + 1 = 20erişimlerin engellemek, 1,000,000 bloktan bambaşka bir bulmak için gerekli kere firstName olmayan endeksli tabloda maçı.

Ne zaman kullanılmalıdır?

bir dizin oluşturma (277778 bloklar bir ~% 28 artış, yukarıdaki örnekten ekstra) ve çok fazla endeksleri dosya sistemleri boyut sınırları kaynaklanan sorunlara neden olabilir ek disk alanı gerektirir göz önüne alındığında, dikkatli düşünce doğru seçmek için kullanılmalıdır endekse alanlar.

endeksleri sadece kayıtları içinde eşleşen bir alan için arama hızlandırmak için kullanıldığından, bu nedenle bir ekleme yaparken disk alanı ve işlem süresi sadece kaybı olacağını sadece çıkış için kullanılan indeksleme alanları akla veya silme işlemi ve standları kaçınılmalıdır. Ayrıca ikili aramanın niteliğini göz önüne alındığında, verinin kardinalitesi veya tekliği önemlidir. 1.000'lik bir önem düzeyi yaklaşık 1.000 kayıtları dönmek ise bir 2 cardinality sahip bir alanda dizin, devre verileri bölünmüş olacaktır. Böyle düşük kardinalitesi ile etkinliği doğrusal tür indirgenir ve sorgu iyileştirici kardinalitesi etkili bir indeks alanı kaybıdır yapma, kayıt sayısının% 30'undan daha az olması durumunda dizini kullanarak önleyecektir.

Cevap 04/08/2008 saat 11:41
kaynak kullanıcı

oy
168

Bunu ilk okuduğumda bana çok yardımcı oldu. Teşekkür ederim.

O zamandan beri dizinleri oluşturma dezavantajı hakkında bazı bilgiler elde: Bir tabloya (içine yazarsanız UPDATEveya INSERT IGNORE bir indeksi), dosya sistemindeki aslında iki yazı işlemler gerçekleştirir. (- kümelenmiş eğer - tablo verilerinin başvurmadan) ve ona (bir çareyi ve) tablo verileri ve endeks verileri için başka biri için biri. Masa ve dizin aynı sabit disk üzerinde yer alıyorsa bu daha fazla zaman maliyeti. Böylece bir dizin (bir yığın) olmayan bir tablo, daha hızlı yazma işlemleri için izin verecek. (Eğer iki indeks olsaydı bu kadar üç yazma işlemleri ile bitirmek ve olurdu)

Ancak, / azaltmak zaman artan maliyet sorununu ortadan kaldırabilir endeks verileri ve tablo verileri için iki farklı sabit disklerde iki farklı konuma tanımlayan. Bu istenilen şekilde istenilen sabit diskler ve tablo / dizin konumu tanımına dosyaları göre ek dosya gruplara ayrılması gerekli.

Veri eklenir olarak dizinler ile bir başka sorun, zaman içinde kendi parçalanmasıdır. REORGANIZE, sen rutinleri yazmalısınız yardımcı olur o yapmış.

Bazı senaryolarda bir yığın, endeksler içeren bir tablo daha yararlıdır

Örneğin: - Eğer rakip yazıyor çok var ama sadece bir gece raporlama için dışarıda çalışma saatleri okursanız.

Ayrıca, kümelenmiş olmayan kümelenmiş indeksleri arasında bir ayrım oldukça önemlidir.

Bana yardımcı: - Kümelenmiş ve Non endeksi aslında ne anlama kümelenmiş mı?

Cevap 30/04/2013 saat 15:31
kaynak kullanıcı

oy
124

Bir dizin bir veritabanındaki belirli bir sütun için hızlı arama yapar sadece bir veri yapısıdır. Bu yapı genellikle b- ağaç veya karma tablo ama başka mantık yapısı olabilir.

Daha fazla bilgi için, ben tavsiye: Nasıl veritabanı indeksleri çalışır? Ve nasıl endeksleri yardım ediyorsun?

Cevap 20/02/2014 saat 15:40
kaynak kullanıcı

oy
86

Şimdi, biz 'Abc' adlı herhangi çalışanların tüm ayrıntıları bulmak için bir sorgu çalıştırmak istediğiniz diyelim?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

bir dizin olmadan ne olurdu?

Veritabanı yazılımı anlamıyla o satırın Employee_name 'Abc' olup olmadığını görmek için Çalışan tablosundaki her bir satırda bakmak gerekir. Biz de içinde adı 'Abc' ile her satır istiyorum, çünkü adı ile diğer satırlar olabilir çünkü, biz sadece biz adı 'Abc' ile sadece bir satırı bulup bir kez bakarak duramazsın Abc . Yani, son satıra kadar her satır aranacak olmalıdır - adı 'Abc' ile satırları bulmak için veritabanı tarafından muayene gerekecektir bu senaryoda sıralar binlerce anlamına gelir. Bu denen şeydir tam tablo taraması

Bir veritabanı indeks performansını nasıl yardımcı olabilir

bir dizin sahip bütün mesele esasen incelenecek gereken bir tablodaki kayıtları / satır sayısını azaltarak arama sorgularını hızlandırmak olduğunu. Bir dizin bir tabloda belirli bir sütunda değerlerini depolayan bir veri yapısı (en yaygın bir B- ağacı) olduğunu.

B-ağaçları endeksi nasıl çalışır?

göz-up, silme, ve eklemeleri tüm logaritmik sürede yapılabilir çünkü - neden B- ağaç indeksleri için en popüler veri yapısı onlar verimli zaman olduğu gerçeği nedeniyle vardır. B- ağacın içinde saklanan veri sıralanabilir çünkü, B- ağaçları daha yaygın kullanılan bir başka önemli nedenidir. RDBMS tipik olarak aslında bir dizin için kullanılan veri yapısı belirler. Ama bazı RDBMS ile 'bazı senaryolarda, aslında sen endeksi kendisi oluştururken veritabanı kullanmak istediğiniz veri yapısı belirtebilirsiniz.

Bir karma tablo endeksi nasıl çalışır?

karma indeksleri kullanılır nedeni sadece değerlerini aramada geldiğinde hash tabloları son derece verimlidir çünkü. onlar karma endeksi kullanmak, yani bir dizeye eşitlik karşılaştırmak sorguları çok hızlı değerlerini alabilir.

Örneğin, daha önce tartıştığımız sorgu Employee_name sütun üzerinde oluşturulan karma endeksi yararlanabilecek. Bir karma endeksi çalışacak yolu sütun değeri karma tabloya anahtarı ve sadece tablodaki satır veri işaretçisi olacağını bu anahtarla eşleştirilir gerçek değer olacak olmasıdır. Bir karma tablo temelde bir ilişkili dizi olduğu için tipik bir giriş 0x28939 Abc hafızada saklanır tablo satırına bir referanstır “Abc => 0x28939" gibi görünecektir. Bir karma tablo endeksinde “Abc” gibi bir değere aranıyor ve bellekte satıra referansı geri alma açıkçası çok daha hızlı Employee_name sütununda “Abc” değerine sahip tüm satırları bulmak için tablonun taranmasını aşıyor.

Bir karma endeksi dezavantajları

Hash tablo veri yapılarını sıralanır değil ve karma endeksleri bile yardımcı olamaz sorguları birçok türü vardır. Örneğin, az 40 yıllık çalışanların tüm öğrenmek istediğinizi varsayalım. Nasıl bir karma tablo indeksi bunu yapabilir? Bir karma tablo anahtar değer çiftleri bakmak için sadece iyi Evet çünkü bu mümkün değil - eşitlik için kontrol sorguları anlamına gelir

Tam olarak ne bir veri tabanı endeksinin içinde mi? Dolayısıyla, artık bir veritabanı indeks Tablodaki bir sütun üzerinde oluşturulan biliyoruz ve endeks bu belirli sütundaki değerleri depolayan söyledi. Ama, bir veritabanı dizini aynı tablonun diğer sütunlarındaki değerleri depolamak olmadığını anlamak önemlidir. Biz Employee_name sütun üzerinde dizin oluşturmak Örneğin, bu Employee_Age ve Employee_Address sütun değerleri de endekste saklanmaz anlamına gelir. Biz sadece endeksindeki tüm diğer sütunları saklamak olmadıysa, o zaman sadece tüm tablo başka bir kopyasını oluşturmak gibi olacak - yol çok fazla yer alacağını ve çok verimsiz olurdu.

Bir dizin kullanmak, nasıl bir veritabanı biliyor? Çalıştırılır, veritabanı sorgulanan kolonuna (lar) üzerinde bir indeks olup olmadığını kontrol eder gibi bir sorgu “Employee_name = 'Abc' NEREDEN Çalışan SELECT * FROM” Ne zaman. Veritabanı dizini kullanmak aslında daha az verimlidir bazı senaryo vardır çünkü - Employee_name sütunu varsayarsak üzerinde oluşturulan bir dizin var, veritabanı aslında değerleri arandı bulmak için dizini kullanmak mantıklı karar vermek zorunda kalacak ve daha etkili sadece tüm tabloyu taramak için.

Bir veritabanı indeksine sahip maliyeti nedir?

ve daha büyük masanızı daha büyük Dizininizi - O yer kaplar. endeksler ile bir başka performans isabet, aynı işlemler endeksinize için yapılması gerekecektir Eğer ilgili tabloda, ekleme, silme veya güncelleme satırlar her gerçeğidir. Bir dizin dizin kapsadığını tablo sütunu (ler) ne varsa olarak dakikalık verilere aynı içermesine gerektiğini unutmayın.

endeksli sütundaki verilerin sık sık sorgulanan edilecektir Genel bir kural olarak, bir dizin sadece bir tablo üzerinde oluşturulmalıdır.

Ayrıca bakınız

  1. Ne kolonlar genellikle iyi endeksleri yapmak?
  2. Nasıl veritabanı indeksleri nasıl çalışır
Cevap 13/08/2016 saat 18:36
kaynak kullanıcı

oy
64

Klasik örnek "Kitaplar İndeksi"

100 bölümden bölü 1000 sayfalık bir "Kitap", X sayfaları ile her bölüm düşünün.

Basit, ha?

Şimdi, bir indeks sayfası olmadan, mektup, "S" ile başlayan belirli bir bölümünü bulmak için, tüm kitap aracılığıyla tarayarak dışında başka seçenek var. yani: 1000 sayfa

Ama başında bir indeks sayfası ile, sen vardır. Ve daha, sadece tekrar tekrar, dizin sayfasına bakmak için her zaman ihtiyaç konularda herhangi bir bölümünü okumak için. Eşleştirme endeksi bulduktan sonra verimli diğer bölümleri atlayarak bölüme atlayabilir.

Ama sonra, 1000 sayfaya ek olarak, indeks sayfasını görüntülemek için başka ~ 10 sayfa, bu yüzden tamamen 1010 sayfaları gerekecektir.

Bu nedenle, göstergesi etkili bir görünüm çekimler için sıralı bir şekilde yer alan bir satıra endeksli sütun + işaretçi değerlerini depolayan ayrı bir bölüm.

Yapılacaklar o, okullarda basit öyle değil mi? : P

Cevap 23/04/2017 saat 14:43
kaynak kullanıcı

oy
40

Basit Açıklama !!!!!!!!!!

endeks bir tablo içinde belirli bir sütun için değerleri saklayan bir veri yapısı başka bir şey değildir. Bir dizin bir tablonun bir sütun üzerinde oluşturulur.

İsim, Yaş ve Adres - Örnek, üç sütunlu Kullanıcı adı verilen bir veritabanı tablosu var. Kullanıcı tablo satırları binlerce sahip olduğunu varsayalım.

Şimdi, biz 'John' adlı herhangi kullanıcılarının tüm bilgilerini bulmak için bir sorgu çalıştırmak istediğiniz diyelim. aşağıdaki sorguyu çalıştırırsanız.

SELECT * FROM User 
WHERE Name = 'John'

Veritabanı yazılımı anlamıyla o satırın adı 'John' olup olmadığını görmek için Kullanıcı tablosundaki her bir satırda bakmak gerekir. Bu uzun zaman alacaktır.
Indeks bize yardımcı olur Burası "endeks esas incelenmesi gereken bir tablodaki kayıtları / satır sayısını azaltarak arama sorgularını hızlandırmak için kullanılır" dir.
Nasıl bir dizin oluşturmak için

CREATE INDEX name_index
ON User (Name)

Bir indeks kolon değerleri (Örnek: John) oluşur, bir tablodan, bu değerler bir veri yapısı depolanan.
Yani şimdi veritabanı indeks muhtemelen Kullanıcılar adına göre alfabetik olarak sıralanacaktır çünkü John adında çalışanları bulmak için dizini kullanır. Ve bu sıralanır çünkü, bir isim ararken demektir bütün isimlerin bir “J” ile başlayan endekste yanyana doğru olacaktır çünkü çok daha hızlı olduğunu!

Cevap 02/08/2016 saat 01:30
kaynak kullanıcı

oy
18

Sadece hızlı öneri uygulamanız daha ekleme / güncelleme işlemi gerektiriyorsa, sen endeksler olmadan tabloları kullanmak isteyebilirsiniz, ama daha veri alma işlemlerini gerektirir eğer öyleyse .. indeksleme maliyetleri gibi ek yazıyor ve depolama alanı, sen endeksli için gitmeli tablo.

Cevap 14/01/2015 saat 06:44
kaynak kullanıcı

oy
14

Sadece bir kitabın Index olarak Veritabanı Index düşünüyorum. Eğer köpekler hakkında bir kitap var ve tabii kitabın tüm sayfalarını çevirmeye ve aradığınız ne bulabiliriz, diyelim Alman Çoban let hakkında bilgi bulmak istiyor ama tabii bu çok zaman alıcıdır ve Değilse hızlı. Başka bir seçenek de sadece kitabın Endeksi bölümüne gidin ve sonra (bu örnekte Alman Çoban) Eğer aradığınız kişiliğin ad kullanarak arayan ve aynı zamanda sayfa numarasından aradığı bulabildiğim, yani hızlı bir şekilde aradığınızı bulacaksınız. Veritabanı, sayfa numarası biriminin yer aldığı diskte adrese veritabanını yönlendiren bir işaretçi olarak adlandırılır. Aynı Alman Çoban benzetme yapmak gerekirse, böyle bir şey ( “Alman Çoban” yaratabileceğini,

Kısaca, bir indeks sorgu arama hızlandırmak üzere bir tabloda belirli bir sütun için değerleri saklayan bir veri yapısıdır.

Cevap 21/12/2016 saat 17:16
kaynak kullanıcı

oy
7

SQL endeksi SQL veritabanında arama arttıran ilgili bir şeydir. Dizin programcı çok hızlı veritabanından veri almak için izin verir. Eğer bir öğrenci veya bazı kitap okuyucu olduğunu varsayalım. Kitabınız 50.000 sayfa içeriyor. İlk gün size bazı başka konu “xyz” Okumak istediğiniz bazı konu “ABC” Ertesi gün okuyun. el sayfa tarafından sayfadan geçmesi asla. Ne bu durumda ne olacak bazı özel konuyu bakmak ve ardından konuyla doğrudan atla bölgesine endeksi kullanmaktır. Dizin konuyu aramak için zaman senin sürü kaydedildi. SQL endeksinde aynı Endeks veritabanından çok hızlı kayıtları milyonlarca arama yapmanızı sağlar.

Cevap 15/02/2018 saat 10:17
kaynak kullanıcı

oy
2

Bir veri tabanı endeksi veri yapısını korumak için ek yazma ve depolama alanı pahasına, veri tabanı tablosundaki verileri alma işlemleri hızını artırır, bir veri yapısıdır. Endeksler hızlı bir şekilde veri tabanı tablosundaki bir veritabanı tablosu erişilen her zaman her satır aramak zorunda kalmadan verileri bulmak için kullanılır. Endeksler, bir veritabanı tablosunun bir veya daha fazla sütun kullanarak hızlı rastgele aramalarını ve sipariş kayıtları yeterli erişebilmesini için temel sağlayarak oluşturulabilir.

Cevap 09/07/2018 saat 05:33
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more