SQL'de dizin nedir?


440

SQL'de dizin nedir ? Açıkça anlamak için açıklayabilir veya referans verebilir misiniz?

Bir dizini nerede kullanmalıyım?

Yanıtlar:


377

Veritabanında aramayı hızlandırmak için bir dizin kullanılır. MySQL'in konuyla ilgili bazı iyi belgeleri vardır (diğer SQL sunucuları için de geçerlidir): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Bir dizin, sorgunuzdaki bazı sütunlarla eşleşen tüm satırları verimli bir şekilde bulmak ve ardından tam eşleşmeleri bulmak için tablonun yalnızca bu alt kümesinde gezinmek için kullanılabilir. Cümlede herhangi bir sütunda dizinleriniz yoksa WHERE, SQLsunucunun tüm tablodan geçmesi ve eşleşip eşleşmediğini görmek için her satırı kontrol etmesi gerekir, bu da büyük tablolarda yavaş bir işlem olabilir.

Dizin de bir UNIQUEdizin olabilir, yani bu sütunda yinelenen değerlere sahip olamayacağınız veya PRIMARY KEYbazı depolama motorlarında değerin saklandığı veritabanı dosyasında nerede olduğunu tanımlayabilirsiniz.

MySQL'de , sorgunuzun herhangi bir dizini kullanıp kullanmayacağını görmek için ifadenizin EXPLAINönünde SELECTkullanabilirsiniz. Bu, performans sorunlarını gidermek için iyi bir başlangıçtır. Daha fazla bilgiyi buradan edinebilirsiniz: http://dev.mysql.com/doc/refman/5.0/en/explain.html


"Dizin aynı zamanda BENZERSİZ bir dizin de olabilir ..." Sadece sizinle teyit etmek, dizin DİZİ OLMAYAN olabilir anlamına mı geliyor? Her zaman BENZERSİZ olduğunu düşündüm. SQL için oldukça yeniyim, affedersiniz
Daniel Kurniadi

@DanielKurniadi Çoğu dizin benzersiz değildir. Bir kullanıcı veritabanı olabilir ve Göteborg'da yaşayan herkes için sorgulamak istiyorum. "Şehir" alanındaki bir dizin sorgumu hızlandıracaktır. Ancak Göteborg'da yaşayan 1'den fazla kullanıcı var, bu nedenle dizin benzersiz olmamalı.
Emil Vikström

174

Kümelenmiş dizin telefon rehberinin içeriğine benzer. Kitabı 'Hilditch, David' adresinde açabilir ve 'Hilditch'in hemen yanındaki tüm bilgileri yan yana bulabilirsiniz. Kümelenmiş dizinin anahtarları şunlardır (soyadı, adı).

Bu, kümelenmiş dizinleri, tüm veriler yan yana bulunduğundan aralık tabanlı sorgulara dayanan çok sayıda veri almak için harika hale getirir.

Kümelenmiş dizin aslında verilerin nasıl depolandığıyla ilgili olduğundan, tablo başına bunlardan yalnızca biri mümkündür (ancak birden çok kümelenmiş dizini simüle etmek için hile yapabilirsiniz).

Kümelenmemiş bir dizin, çoğuna sahip olabileceğiniz için farklıdır ve daha sonra kümelenmiş dizindeki verilere işaret eder. Anahtarlanmış bir telefon rehberinin arkasında (şehir, adres) örneğin kümelenmemiş bir dizininiz olabilir.

Telefon defterinde 'Londra'da yaşayan tüm insanları aramak zorunda kaldığınızı düşünün - sadece kümelenmiş dizinle, kümelenmiş dizindeki anahtar açık olduğundan (soyadı, ad) ve sonuç olarak Londra'da yaşayan insanlar endeks boyunca rastgele dağılmıştır.

(Şehir) üzerinde kümelenmemiş bir dizininiz varsa, bu sorgular çok daha hızlı gerçekleştirilebilir.

Umarım yardımcı olur!


151

Çok iyi bir benzetme, veritabanı dizinini bir kitaptaki dizin olarak düşünmektir. Ülkelerle ilgili bir kitabınız varsa ve Hindistan'ı arıyorsanız, neden veritabanı terminolojisinde tam bir masa taramasının eşdeğeri olan kitabın tamamını çevirmek istersiniz - Hindistan hakkında bilgi bulabileceğiniz tam sayfaları anlatacak. Benzer şekilde, bir kitap dizini bir sayfa numarası içerdiğinden, bir veritabanı dizini, SQL'inizde aradığınız değeri içeren satıra bir işaretçi içerir.

Daha fazla burada


2
Ben "analojiler" kullanarak şeyleri açıklayan deneyimli adamlara hayranım. +1
snr

82

Sorguların performansını hızlandırmak için bir dizin kullanılır. Bunu, ziyaret edilmesi / taranması gereken veritabanı veri sayfalarının sayısını azaltarak yapar.

SQL Server'da, kümelenmiş bir dizin bir tablodaki verilerin fiziksel sırasını belirler. Tablo başına yalnızca bir kümelenmiş dizin olabilir (kümelenmiş dizin tablodur). Bir tablodaki diğer tüm dizinler kümelenmemiş olarak adlandırılır.


49

Dizinler, verileri hızlı bir şekilde bulmakla ilgilidir .

Veritabanındaki dizinler, bir kitapta bulduğunuz dizinlere benzer. Bir kitabın bir dizini varsa ve sizden o kitapta bir bölüm bulmanızı rica ediyorum, bunu dizinin yardımıyla hızlı bir şekilde bulabilirsiniz. Diğer yandan, kitabın bir dizini yoksa, kitabın başından sonuna kadar her sayfaya bakarak bölümü aramak için daha fazla zaman harcamanız gerekecektir.

Benzer şekilde, veritabanındaki dizinler sorguların verileri hızlı bir şekilde bulmasına yardımcı olabilir. Dizinlerde yeniyseniz, aşağıdaki videolar çok yararlı olabilir. Aslında onlardan çok şey öğrendim.

Dizin Temelleri
Kümelenmiş ve Kümelenmemiş Dizinler
Benzersiz ve Benzersiz Olmayan Dizinler Dizinlerin
avantajları ve dezavantajları


Tüm cevapları okumak neden her şeyi dizine eklemediğimi merak etti. Dezavantajları içeren bağlantıyı dahil etmek için +1.
Lakshay Garg

@LakshayGarg Bazen gereksiz indeksleme de sorgunun yürütme süresini yavaşlatabilir, bu nedenle her şeyi indekslememeliyiz. Her şeyin kendi artıları ve eksileri olduğu gibi.
Gaurav Rajdeo

@LakshayGarg Gaurav Rajdeo haklı. Aynı benzetmeyi çok koru: Bir kitaptaki her bölümü veya şekli veya tabloyu dizine eklemek isteyebilirsiniz, ancak her paragrafı, cümleyi veya kelimeyi dizine eklemek istemeyebilirsiniz. Normalde, bu aşırıya kaçar ve gereksiz komplikasyonlara yol açar. Umarım bu cevapta çizilen resme yeterince yakındır.
colidyre

23

Genel olarak endeks bir B-tree. İki tür dizin vardır: kümelenmiş ve kümelenmemiş.

Kümelenmiş dizin, satırların fiziksel bir sırasını oluşturur (yalnızca bir olabilir ve çoğu durumda birincil anahtardır - tabloda birincil anahtar oluşturursanız, bu tabloda da kümelenmiş dizin oluşturursunuz).

Kümelenmemiş dizin de bir ikili ağaçtır, ancak fiziksel bir satır sırası oluşturmaz. Kümelenmemiş dizinin yaprak düğümleri PK (varsa) veya satır dizini içerir.

Dizinler arama hızını artırmak için kullanılır. Çünkü karmaşıklık O'dur (log N). Dizinler çok büyük ve ilginç bir konudur. Büyük veritabanında dizin oluşturmanın bazen bir tür sanat olduğunu söyleyebilirim.


6
genel olarak, bir ikili ağaç yerine b-ağacı.
Mitch Wheat

yani, dizinler kendi kendini dengeleyen ağaçlar kullandığından, her satır eklediğinizde / sildiğinizde kendini dengeler - ekleme / silme işlemini daha pahalı hale getirir ... doğru mu?
David Refaeli

20

INDEXES - kolayca veri bulmak için

UNIQUE INDEX - yinelenen değerlere izin verilmiyor

İçin sözdizimi INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

İçin sözdizimi UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

Öncelikle sorgunun normal (indeksleme olmadan) nasıl çalıştığını anlamamız gerekir. Temelde her satırı teker teker gezer ve verileri bulduğunda geri döner. Aşağıdaki resme bakın. (Bu resim bu videodan alınmıştır .)

Dizin oluşturmadan Diyelim ki sorgu 50 bulmak, 49 kayıt doğrusal bir arama olarak okumak zorunda kalacak.

Aşağıdaki resme bakın. (Bu resim bu videodan alınmıştır )

resim açıklamasını buraya girin

Dizin oluşturmayı uyguladığımızda, sorgu, her bir geçişteki verilerin yarısını bir ikili arama gibi ortadan kaldırarak her birini okumadan verileri hızlı bir şekilde bulur. MySQL dizinleri, tüm verilerin yaprak düğümünde olduğu B-ağacı olarak saklanır.


12

INDEX, veri alma işlemini hızlandıran bir performans optimizasyon tekniğidir. Bu tablodan (veya Görünüm) veri alınırken performansı artırmak amacıyla bir Tablo (veya Görünüm) ile ilişkilendirilen kalıcı bir veri yapısıdır.

Dizin tabanlı arama, özellikle sorgularınız WHERE filtresi içeriyorsa uygulanır. Aksi takdirde, yani, WHERE filtresi olmayan bir sorgu tüm verileri ve işlemi seçer. INDEX olmadan tüm tabloyu aramaya Tablo taraması denir.

Sql-Index için kesin bilgileri açık ve güvenilir bir şekilde bulacaksınız: bu bağlantıları takip edin:

  1. Cocnept-wise anlayışı için: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Uygulamaya yönelik anlayış için: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

Bir dizin birkaç farklı nedenden dolayı kullanılır. Bunun ana nedeni, satırları alabilmek veya satırları daha hızlı sıralayabilmek için sorgulamayı hızlandırmaktır. Başka bir neden, başka hiçbir sütunun aynı değerlere sahip olmadığını garanti edecek bir birincil anahtar veya benzersiz bir dizin tanımlamaktır.


6

SQL Server kullanıyorsanız, en iyi kaynaklardan biri, yükleme ile birlikte gelen kendi Çevrimiçi Kitaplarıdır! Herhangi bir SQL Server ile ilgili konular için başvuracağım ilk yer.

Pratik ise "bunu nasıl yapmalıyım?" sorularınız varsa, StackOverflow sormak için daha iyi bir yer olacaktır.

Ayrıca, bir süredir geri gelmedim ama sqlservercentral.com en iyi SQL Server ile ilgili sitelerden biriydi.


0

Dizin bir on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Dizin, tablo veya görünümdeki bir veya daha fazla sütundan oluşturulmuş anahtarlar içerir. Bu anahtarlar, SQL Server'ın anahtar değerleriyle ilişkili satırı veya satırları hızlı ve verimli bir şekilde bulmasını sağlayan bir yapıda (B ağacı) saklanır.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Bir PRIMARY KEY yapılandırırsanız, kümelenmiş bir dizin yoksa Veritabanı Altyapısı otomatik olarak kümelenmiş bir dizin oluşturur. Varolan bir tabloda bir PRIMARY KEY kısıtlamasını zorlamaya çalıştığınızda ve bu tabloda zaten kümelenmiş bir dizin varsa, SQL Server kümelenmemiş bir dizin kullanarak birincil anahtarı zorlar.

Dizinler (kümelenmiş ve kümelenmemiş) hakkında daha fazla bilgi için lütfen buna bakın: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view= sql-server-ver15

Bu yardımcı olur umarım!

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.