Veritabanı indeksleme nasıl çalışır? [kapalı]


2420

Veri kümenizin boyutu arttıkça dizine eklemenin çok önemli olduğu göz önüne alındığında, birisi veritabanının agnostik düzeyde dizinin nasıl çalıştığını açıklayabilir mi?

Bir alanı dizine ekleme sorguları hakkında bilgi için Bir veritabanı sütununu nasıl dizinlerim ?

Yanıtlar:


3547

Neden gerekli?

Veriler disk tabanlı depolama aygıtlarında depolandığında, veri blokları olarak saklanır. Bu bloklara bütünüyle erişilerek atomik disk erişim işlemi yapılı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, bir sonraki düğümün (veya bloğun) konumunu gösteren bir işaretçi içerir ve her ikisinin de bitişik olarak depolanması gerekmez.

Bir dizi kaydın yalnızca bir alanda sıralanabilmesi nedeniyle, sıralanmamış bir alanda arama yapmanın N/2blok Nerişimi (ortalama) gerektiren Doğrusal Arama gerektirdiğini (ortalama olarak), masa açık. Bu alan anahtar olmayan bir alansa (başka bir deyişle benzersiz girişler içermiyorsa), Nblok erişimlerinde tablo alanının tamamı aranmalıdır .

Sıralı bir alanla birlikte, log2 Nblok erişimi olan bir İkili Arama kullanılabilir . Ayrıca, veriler anahtar olmayan bir alana göre sıralandığından, daha yüksek bir değer bulunduğunda tablonun geri kalanının yinelenen değerler için aranması gerekmez. Böylece performans artışı büyüktür.

Endeksleme nedir?

Dizin oluşturma, birden çok alanda birkaç kaydı sıralamanın bir yoludur. Tablodaki bir alanda dizin oluşturmak, alan değerini tutan başka bir veri yapısı ve ilişkili kayıt için bir işaretçi oluşturur. Bu indeks yapısı daha sonra, Binary Search'lerin üzerinde yapılmasına izin verilerek sıralanır.

Endekslemenin dezavantajı, endekslerin MyISAM motorunu kullanan bir tabloda birlikte depolandığından, bu endekslerin diskte ek alan gerektirmesidir, aynı tablodaki birçok alan dizine eklendiğinde bu dosya temel dosya sisteminin boyut sınırlarına hızla ulaşabilir .

O nasıl çalışır?

İlk olarak, örnek bir veritabanı tablosu şemasının ana hatlarını çizelim;

Alan adı Veri türü Diskteki boyut
id (Birincil anahtar) İmzasız INT 4 bayt
firstName Karakter (50) 50 bayt
lastName Karakter (50) 50 bayt
Adres Char (100) 100 bayt

Not : char, disk değerinde doğru bir boyuta izin vermek için varchar yerine kullanılmıştır. Bu örnek veritabanı beş milyon satır içerir ve dizinsizdir. Şimdi birkaç sorgunun performansı analiz edilecektir. Bunlar id (sıralanmış anahtar alanı) ve firstName (anahtar olmayan sıralanmamış alan) kullanan bir sorgudur .

Örnek 1 - sıralanmamış alanlara göre sıralanmış

r = 5,000,000Sabit bir boyuttaki kayıtların örnek veritabanımıza göre, kayıt uzunluğu R = 204bayt verir ve bunlar varsayılan blok boyutu B = 1,024baytlarını kullanan MyISAM motoru kullanılarak bir tabloda saklanır . Tablonun engelleme faktörü bfr = (B/R) = 1024/204 = 5disk bloğu başına kayıt olacaktır . Tabloyu tutmak için gereken toplam blok sayısı N = (r/bfr) = 5000000/5 = 1,000,000bloktur.

Kimlik alanındaki bir doğrusal arama, id alanının N/2 = 500,000anahtar bir alan olduğu göz önüne alındığında, bir değer bulmak için ortalama bir blok erişimi gerektirir. Ancak kimlik alanı da sıralandığından, ortalama log2 1000000 = 19.93 = 20blok erişimi gerektiren bir ikili arama gerçekleştirilebilir . Anında bunun ciddi bir gelişme olduğunu görebiliriz.

Artık firstName alanı ne sıralanmış ne de anahtar alandır, bu nedenle ikili bir arama imkansız değildir ve benzersiz değerler değildir ve bu nedenle tablo, tam bir N = 1,000,000blok erişimi için sonuna kadar arama yapmayı gerektirecektir . Endekslemenin düzeltmeyi amaçladığı durum budur.

Bir dizin kaydının yalnızca dizinlenmiş alanı ve orijinal kaydın işaretçisini içerdiği göz önüne alındığında, işaret ettiği çok alanlı kayıttan daha küçük olacağı anlamına gelir. Bu nedenle dizinin kendisi orijinal tablodan daha az disk bloğu gerektirir, bu nedenle yineleme için daha az blok erişimi gerektirir. FirstName alanındaki bir dizinin şeması aşağıda özetlenmiştir;

Alan adı Veri türü Diskteki boyut
firstName Karakter (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 - Dizinleme

r = 5,000,000Endeks kaydı uzunluğu R = 54bayt ve varsayılan blok boyutu B = 1,024bayt kullanan kayıt örnek veritabanımız verildi . Dizinin engelleme faktörü, bfr = (B/R) = 1024/54 = 18disk bloğu başına kayıt olacaktır . Dizini tutmak için gereken toplam blok sayısı N = (r/bfr) = 5000000/18 = 277,778bloktur.

Artık firstName alanını kullanan bir arama, performansı artırmak için dizini kullanabilir. Bu, ortalama log2 277778 = 18.08 = 19blok erişimi olan dizinin ikili aramasına izin verir . Okumak için daha fazla blok erişimi gerektiren gerçek blok adresini bulmak için toplam erişimi blok erişimine getirerek, dizinlenmemiş tabloda 19 + 1 = 20bir firstName eşleşmesi bulmak için gereken 1.000.000 blok erişiminden çok daha fazla ağlama gerekir .

Ne zaman kullanılmalıdır?

Bir dizin oluşturmanın ek disk alanı gerektirdiği (yukarıdaki örnekten 277.778 blok daha fazla, ~% 28 artış) ve çok fazla endeksin dosya sistemleri boyut sınırlarından kaynaklanan sorunlara neden olabileceği göz önüne alındığında, doğru seçimi seçmek için dikkatli düşünülmelidir dizine eklenecek alanlar.

Endeksler 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 basitçe bir disk alanı ve işlem süresi kaybı olması ve dolayısıyla kaçınılmalıdır. İkili bir araştırmanın doğası da dikkate alındığında, verilerin kardinalitesi veya tekliği önemlidir. Kardinalitesi 2 olan bir alanda endeksleme, verileri ikiye bölerken, 1.000'lik bir kardinalite yaklaşık 1.000 kayıt döndürür. Böyle düşük bir kardinalite ile etkinlik doğrusal bir sıraya indirgenir ve kardinalite kayıt numarasının% 30'undan azsa, sorgu optimize edici endeksi kullanmaktan kaçınır ve endeksi etkin bir şekilde alan kaybı haline getirir.


8
ikili arama veri benzersiz olduğunda yapılabilir, değil mi? minimum kardinalitenin önemli olduğunu belirtmiş olsanız da, algoritma basit bir ikili arama olmaz, bu yaklaşım (~ log2 n) işlem süresini nasıl etkiler?
şampuan

9
@AbhishekShivkumar: Harika bir soru! Sanırım dizin tablosunun veri tablosunda olduğu kadar çok satırı olacak. Ve bu alan sadece 2 değere sahip olacağından (true / false ile boole) ve true değerine sahip bir kayıt istediğinizi söyledikten sonra, yalnızca ilk geçişte sonuç kümesini yarıya indirebilirsiniz, ikinci geçişte tüm kayıtlarınız true değerine sahiptir, böylece ayırt etmek için bir temel yok, şimdi veri tablosunu doğrusal bir şekilde aramak zorundasınız, bu nedenle endeksli sütuna karar verirken kardinalitenin dikkate alınması gerektiğini söyledi. Bu durumda, böyle bir sütunda dizin oluşturmak değersizdir. Umarım
haklıyım

7
ortalama durumda blok erişim sayısı olmamalıdır (N+1)/2. Mümkün olan tüm durumlar için blok erişim sayısını toplar ve bunu vaka sayısına böldüğümüzde, N*(N+1)/(2*n)hangisi olduğu ortaya çıkar (N+1)/2.
ajay

31
Bu cevapta, örneğin cümle içinde birkaç yazım hatası olduğunu düşünüyorum: "dizinsiz tablo tarafından gerekli 277,778 blok erişim çok uzak bir ağ." yazar 1.000.000 blok erişimi anlamına gelmiyor mu? 277.778, dizinin kendisi için gereken blok sayısıdır. Birkaç başka yanlışlık da var gibi görünüyor :(
jcm

5
@jcm "İndeksleme bölümü nedir" - "Dizin oluşturma, birden çok alanda birkaç kayıt sıralamanın bir yoludur. Tablodaki bir alanda dizin oluşturmak, alan değerini ve işaretçiyi tutan başka bir veri yapısı oluşturur Daha sonra bu dizin yapısı sıralanır ve İkili Aramaların üzerinde yapılmasına izin verilir. "
grinch

294

Klasik örnek "Kitaplarda Dizin"

Her biri 100 sayfalık 10 bölüme ayrılmış 1000 sayfalık bir "Kitap" düşünün.

Basit, ha?

Şimdi, " Simyacı " kelimesini içeren belirli bir Bölümü bulmak istediğinizi düşünün . Dizin sayfası olmadan, tüm kitabı / Bölümleri taramaktan başka seçeneğiniz yoktur. yani: 1000 sayfa.

Bu benzetme veritabanı dünyasında "Tam Tablo Taraması" olarak bilinir .

resim açıklamasını buraya girin

Ancak bir dizin sayfasıyla nereye gideceğinizi biliyorsunuz! Ve dahası, önemli olan herhangi bir Bölümü aramak için, dizin sayfasını her seferinde tekrar tekrar gözden geçirmeniz gerekir. Eşleşen dizini bulduktan sonra geri kalanını atlayarak bu bölüme etkili bir şekilde atlayabilirsiniz.

Ancak, gerçek 1000 sayfaya ek olarak, endeksleri göstermek için başka bir ~ 10 sayfaya ihtiyacınız olacak, bu yüzden toplam 1010 sayfa.

Bu nedenle, dizin, verimli aramalar için dizinlenmiş sütun + işaretçisi değerlerini dizinlenmiş satıra sıralı bir sırayla depolayan ayrı bir bölümdür.

Okullarda işler basit, değil mi? : P


24
gerçekten güzel bir benzetme! komik bir kitap endeksi ve bir db endeksi arasındaki bağlantı yapmadım
Yolo Voe

2
Bu beni düşündürüyor Libraryya da Grocery Store bir markette bir indekse sahip değil misiniz? Where's The Beef?!? Oh its next to the Restrooms, a mop, and makeup
JayRizzo

3
"Ama başlangıçta bir dizin sayfası varken, oradasınız." "Sen ordasın" ne demek?
Frizbetaryan

2
Endeksler genellikle kitapların arkasına giderken, içindekiler tablosu öne gider. Ancak, bu, benzetmeyi daha da iyi hale getirir, çünkü sütun sırası önemli olmamalıdır.
undrline

1
Açıklamanız çok kolay. Diğer insanlar bir şeyleri açıklamak için karmaşık terimler kullanma eğilimindedir. Keşke birden fazla oy verebilsem.
emeraldhieu

240

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

O zamandan beri dizin oluşturmanın dezavantajı hakkında bir fikir edindim: bir dizine sahip bir tabloya ( UPDATEveya INSERT) yazarsanız, dosya sisteminde aslında iki yazma işleminiz vardır. Biri tablo verileri için, diğeri de dizin verileri için (ve bunun başvurusu (ve - kümelenmişse - tablo verilerinin tesisi)). Tablo ve dizin aynı sabit diskte bulunuyorsa, bu daha fazla zaman alır. Böylece indeksi olmayan bir tablo (yığın), daha hızlı yazma işlemlerine izin verir. (iki dizininiz varsa, üç yazma işlemiyle sonuçlanırsınız vb.)

Ancak, dizin verileri ve tablo verileri için iki farklı sabit diskte iki farklı konum tanımlamak, zaman maliyetinin artması sorununu azaltabilir / ortadan kaldırabilir. Bu, istenen sabit disklerdeki dosyalara göre ek dosya gruplarının tanımlanmasını ve istenen şekilde tablo / dizin konumunun tanımlanmasını gerektirir.

Dizinlerle ilgili bir başka sorun, veri eklendikçe zaman içinde parçalanmasıdır. REORGANIZEyardımcı olur, bunu yapmak için rutinleri yazmanız gerekir.

Belirli senaryolarda bir yığın, dizinleri olan bir tablodan daha yararlıdır,

Örneğin: - Çok sayıda rakip yazınız varsa ancak raporlama için çalışma saatlerinin dışında yalnızca bir gece okuyun.

Ayrıca, kümelenmiş ve kümelenmemiş dizinler arasındaki bir ayrım oldukça önemlidir.

Bana yardımcı oldu: - Kümelenmiş ve Kümelenmemiş dizin aslında ne anlama geliyor?


3
Bence bu indeksleme sorunları, Master ve Slave gibi iki farklı veritabanını koruyarak çözülebilir. Master kayıt eklemek veya güncellemek için kullanılabilir. İndeksleme olmadan. Ve köle uygun indeksleme hakkı ile okumak için kullanılabilir ???
bharatesh

14
hayır, yanlış, üzgünüm. sadece tabloların içeriği değil, aynı zamanda dizin yapısı ve içeriği de (b-ağacı, düğümler) güncellenmelidir. efendi ve köle kavramının burada bir anlamı yok. bu mümkün olabilir, ancak bu iş yükünü ilk veritabanından uzaklaştırmak için analizin yapıldığı ikinci bir veritabanını çoğaltmak veya yansıtmaktır. bu ikinci veritabanı , bu verilerdeki verilerin ve dizinlerin kopyalarını tutar .
Der U

3
Ya ...! Yorumumu okumaya ve düzgün anlamaya çalışın. Aynı şeyi söyledim, master ve slave'e (her ne olursa olsun) "bu iş yükünü ilk veritabanından uzaklaştırmak için analizin yapıldığı ikinci bir veritabanına kopyalama veya yansıtma" olarak bahsettim. verileri "
bharatesh

6
yansıtma veya çoğaltma yapılan ikincil veritabanı, birincisinin yaptığı gibi tüm veri manipülasyonunu deneyimleyecektir. her dml işleminde, bu ikinci veritabanındaki dizinlerde "bu dizin oluşturma sorunları" yaşanır. i kazanç görmüyorum, nerede endeksleri gerekli ve hızlı analiz için inşa onlar güncel tutulması gerekir.
Der U

230

Dizin, yalnızca veritabanındaki belirli bir sütunda aramayı daha hızlı hale getiren bir veri yapısıdır. Bu yapı genellikle bir b-ağacı veya bir karma tablodur, ancak başka bir mantık yapısı olabilir.


29
Endekslemenin temel olarak ne olduğunu basit bir açıklama bulmaya çalışırken bu listeyi bulduğum için bu cevap için milyonda +1 kez.
Josh Burson

1
"Sadece bir veri yapısı" nın "verilere ek" anlamına gelmediğine dikkat edelim. Bazı zamanlar (örn. "Kümelenmemiş dizin"), bazen de verilerin düzenini belirler (örneğin "kümelenmiş dizin").
Pablo H

160

Şimdi diyelim ki 'Abc' olarak adlandırılan çalışanların tüm ayrıntılarını bulmak için bir sorgu çalıştırmak istiyoruz?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

Endeks olmadan ne olur?

Veritabanı yazılımının tam olarak bu tablodaki Çalışan_Adı'nın 'Abc' olup olmadığını görmek için Çalışan tablosundaki her bir satıra bakması gerekir. Biz de içinde adı 'Abc' ile her satır istiyoruz çünkü biz adı 'Abc' ile sadece bir satır bulduktan sonra adı ile diğer satırlar olabilir çünkü, biz sadece bakarak duramazsın Abc . Bu nedenle, son satıra kadar her satır aranmalıdır - yani bu senaryoda binlerce satır 'Abc' adındaki satırları bulmak için veritabanı tarafından incelenmelidir. Buna tam tablo taraması denir

Bir veritabanı dizini performansa nasıl yardımcı olabilir?

Bir endekse sahip olmanın asıl amacı, incelenmesi gereken bir tablodaki kayıt / satır sayısını azaltarak arama sorgularını hızlandırmaktır. Dizin, bir tablodaki belirli bir sütunun değerlerini depolayan 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 etkili olmalarıdır - çünkü aramalar, silmeler ve eklemeler logaritmik zamanda yapılabilir. Ve B-ağaçlarının daha yaygın kullanılmasının bir başka önemli nedeni, B-ağacı içinde saklanan verilerin sıralanabilmesidir. RDBMS tipik olarak bir dizin için gerçekte hangi veri yapısının kullanılacağını belirler. Ancak, bazı RDBMS'leri içeren bazı senaryolarda, dizinin kendisini oluştururken veritabanınızın hangi veri yapısını kullanmasını istediğinizi belirtebilirsiniz.

Karma tablo dizini nasıl çalışır?

Hash indekslerinin kullanılmasının nedeni, hash tablolarının sadece değerlere bakma konusunda son derece verimli olmasıdır. Bu nedenle, bir dizeyle eşitliği karşılaştıran sorgular, bir karma dizini kullanıyorsa 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 indeksinin çalışma şekli, sütun değerinin karma tablonun anahtarı olacağı ve bu anahtara eşlenen gerçek değerin sadece tablodaki satır verilerine bir işaretçi olacağıdır. Bir karma tablo temel olarak ilişkilendirilebilir bir dizi olduğundan, tipik bir girdi “Abc => 0x28939 ″ gibi bir şeye benzeyecektir; burada 0x28939, Abc'nin bellekte depolandığı tablo satırına bir referanstır. Karma tablo dizininde “Abc” gibi bir değere bakmak ve bellekteki satıra geri dönmek, Employee_Name sütununda “Abc” değerine sahip tüm satırları bulmak için tabloyu taramaktan çok daha hızlıdır.

Bir karma endeksinin dezavantajları

Karma tablolar sıralı veri yapıları değildir ve karma indekslerinin bile yardımcı olamadığı birçok sorgu türü vardır. Örneğin, 40 yaşın altındaki tüm çalışanları bulmak istediğinizi varsayalım. Karma tablo dizini ile bunu nasıl yapabilirsiniz? Bu mümkün değil çünkü bir karma tablo yalnızca anahtar / değer çiftlerini aramak için iyidir - bu eşitliği kontrol eden sorgular anlamına gelir

Veritabanı dizininin içinde tam olarak ne var? Böylece, artık bir tablodaki bir sütunda bir veritabanı dizini oluşturulduğunu ve dizinin bu belirli sütundaki değerleri depoladığını biliyorsunuz. Ancak, bir veritabanı dizininin değerleri aynı tablonun diğer sütunlarına kaydetmediğini anlamak önemlidir. Örneğin, Employee_Name sütununda bir dizin oluşturursak, bu, Employee_Age ve Employee_Address sütun değerlerinin de dizinde depolanmadığı anlamına gelir. Diğer tüm sütunları dizinde saklasaydık, tablonun tamamının başka bir kopyasını oluşturmak gibi olurdu - ki bu çok fazla yer kaplar ve çok verimsiz olurdu.

Bir veritabanı ne zaman endeks kullanılacağını nasıl bilir? “SELECT * FROM Employee WHERE Employee_Name = 'Abc'” gibi bir sorgu çalıştırıldığında, veritabanı sorgulanan sütunlarda bir dizin olup olmadığını kontrol eder. Employee_Name sütununun üzerinde bir dizin oluşturulduğunu varsayarsak, veritabanı, aranan değerleri bulmak için dizini kullanmanın gerçekten anlamlı olup olmadığına karar vermek zorundadır - çünkü veritabanı dizinini kullanmanın daha az verimli olduğu bazı senaryolar vardır ve tüm tabloyu taramak için daha verimlidir.

Veritabanı indeksine sahip olmanın maliyeti nedir?

Yer kaplar - tablonuz ne kadar büyükse, dizininiz o kadar büyük olur. Dizinlerle bir başka performans isabeti, ilgili tablodaki satırları her eklediğinizde, sildiğinizde veya güncellediğinizde, dizininize aynı işlemlerin yapılması gerektiğidir. Bir dizinin, dizinin kapsadığı tablo sütun (ları) ndakilerle aynı dakika verilerini içermesi gerektiğini unutmayın.

Genel bir kural olarak, bir dizin yalnızca dizinlenmiş sütundaki veriler sık ​​sık sorgulanacaksa bir tabloda oluşturulmalıdır.

Ayrıca bakınız

  1. Hangi sütunlar genellikle iyi dizinler oluşturur?
  2. Veritabanı dizinleri nasıl çalışır?

4
"bir veritabanı dizini değerleri diğer sütunlarda saklamıyor" - doğru değil.
mustaccio

2
@mustaccio: Dizin satırın referansını yalnızca dizinlenmiş sütunlarla (bildiğim kadarıyla) saklar. Yanlış olabilirim. Dizin, diğer sütun değerlerini saklayan bir referansınız var mı?
Somnath Muluk

3
@ Downvoters: Sadece neyin yanlış olduğunu açıklayabilir miyim?
Somnath Muluk

2
Örneğin SQL Server kümeleme dizinlerini veya DB2'nin CREATE INDEX ... INCLUDEyan tümcesini denetleyin . Bence cevabınızda çok fazla genelleme var.
mustaccio

11
@mustaccio: Yani varsayılan create indexolarak diğer sütunları ve neden olması gerektiğini içermez. If we did just store all the other columns in the index, then it would be just like creating another copy of the entire table, which would take up way too much space and would be very inefficient.. Bu, dizinlerin daha genelleştirilmiş sürümüdür. CREATE INDEX ... INCLUDEdiğer sütunları dikkate alarak yeni sürümdür. Post Açıkladığım daha genel bir versiyon düşünüyor. Tüm veritabanlarını dikkate alırsak dizinler nasıl bir kitap olur? Öyle değil mi? Sizce cevap inmeyi hak ediyor mu?
Somnath Muluk

97

Basit Açıklama!

Dizin, bir tabloda belirli bir sütunun değerlerini depolayan bir veri yapısından başka bir şey değildir . Bir tablonun sütununda bir dizin oluşturulur.

Örnek: UserÜç sütunlu - Name, Ageve adlı bir veritabanı tablonuz var Address. UserTablonun binlerce satırı olduğunu varsayın .

Şimdi diyelim ki 'John' adlı kullanıcıların tüm ayrıntılarını bulmak için bir sorgu çalıştırmak istiyoruz. Aşağıdaki sorguyu çalıştırırsak:

SELECT * FROM User 
WHERE Name = 'John'

Veritabanı yazılımı, kelimenin tam anlamıyla Usertablodaki her bir satıra bakmak zorunda kalacaktır Name. Bu uzun zaman alacaktır.

Burası indexbize yardımcı olur: dizin, incelenmesi gereken bir tablodaki kayıt / satır sayısını azaltarak arama sorgularını hızlandırmak için kullanılır .

Dizin nasıl oluşturulur:

CREATE INDEX name_index
ON User (Name)

A index, bir tablodaki sütun değerlerinden (Örn: John) oluşur ve bu değerler bir veri yapısında saklanır .

Şimdi veritabanı, John adlı çalışanları bulmak için dizini kullanacaktır çünkü dizin muhtemelen Kullanıcılar adına göre alfabetik olarak sıralanacaktır. Ve sıralandığından, bir ad aramanın çok daha hızlı olduğu anlamına gelir çünkü “J” ile başlayan tüm isimler dizinde hemen yan yana olacak!


1
Bir endeks sütunda sıralama düzeni anlamına gelmez
oligofren

4
Teşekkürler. Bu benim anlayışım oldu. Temel olarak bir dizin, sıralanan sütun verilerinin bir kopyasıdır. Normalde sütun verileri, verilerin girildiği sıraya göre yapılır.
Neil

34

Sadece hızlı bir öneri .. İndeksleme ek yazma ve depolama alanı maliyeti olarak, uygulamanız daha fazla ekleme / güncelleme işlemi gerektiriyorsa, dizinsiz tablolar kullanmak isteyebilirsiniz, ancak daha fazla veri alma işlemi gerektiriyorsa, dizinli tablo.


6
Bu bir yorum, cevap değil.
RonJohn

5
Genel bir açıklama olduğu için bu şekilde daha görünür ve dolayısıyla daha yararlıdır. Bu cevaba yorum olarak hangi cevap eklenmelidir?
pfabri

1
muhtemelen OP hakkında bir yorum
guyarad

33

Veritabanı Dizini'ni bir kitabın Dizini olarak düşünün.

Köpekler hakkında 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 - ama bu elbette zaman alıcı ve değil çok hızlı.

Başka bir seçenek de, kitabın Dizin bölümüne gidip aradığınız varlığın adını (bu örnekte, Alman Çobanları) kullanarak ve aradığınız sayfa numarasına bakarak aradığınızı bulabilmenizdir. aradığınızı çabucak bulun.

Veritabanında sayfa numarasına, veritabanını varlığın bulunduğu diskteki adrese yönlendiren bir işaretçi denir. Aynı Alman Çoban benzetmesini kullanarak, böyle bir şeye sahip olabiliriz (“Alman Çoban”, 0x77129), burada 0x77129Alman Çoban için satır verilerinin depolandığı adres.

Kısacası, bir dizin, sorgu aramayı hızlandırmak için belirli bir sütunun değerlerini bir tabloda depolayan bir veri yapısıdır.

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.