Welcome to My Blog 👋

Java, Spring Framework, Microservices, Docker, Kubernetes, AWS and Others 🚀
Follow Me

SQL - Index



  November 11, 2018    Labels:,,,,,,,,, 

İlişkisel veritabanlarında yaptığımız bazı işlemlerde(select, update, delete vs.) ilgilendiğimiz verinin disk üzerinde aranması ciddi bir sorundur. Örneğin 1 milyon satırın olduğu bir hesaplar tablosunda bir kişinin hesabındaki parayı güncelleyeceksiniz. Bu işlem bir banka uygulamasında çok sık yapılan bir işlemdir. Bu işlemi yapmak için önce veritabanı sisteminin hesabı güncellenecek kişiyi bulması daha sonra o kişinin hesabındaki parayı güncellemesi gerekir. Bu tablodaki 1 milyon kaydın içerisinde ilgilendiğimiz verinin bulunması ciddi bir problemdir. Çünkü normal yöntem ile tüm kayıtların tek tek okunması ve bizim sorgumuz ile karşılaştırılması gerekir. Bu işlem bir milyon satır olan bir veritabanında çok uzun sürecektir ve bu bizim istemediğimiz bir şeydir. Bu problemi ortadan kaldırmak için index denilen yapı kullanılır. İndex'ler arama yapılacak kolonlar üzerine kurulur. Daha sonra arama işlemi sadece bu kolonlar üzerinde olur. Bu şekilde arama işleminde ilgilendiğimiz veri boyutunda ciddi bir şekilde azalma olur. Ayrıca geliştirilen çeşitli index türleri ile arama işlemlerinde çeşitli yöntemler kullanılarak bu işlem çok daha kısa sürelerde yapılabilir hale gelmiştir. Genellikle index yapıları her satırı tek başına ifade edebilen primary key'ler üzerine kurulur. Bu şekilde yapılması ve daha sonra bu primary key üzerinde arama yapılması en iyi yöntemdir. Bu konuda bilinmesi gereken bir diğer önemli bilgi ise index'lere sadece select işlemlerinde ihtiyaç duyulmadığıdır. Örneğin bir kaydı güncellemek veya silmek istediğinizde de öncelikle o kaydın bulunması gerekmektedir. Bu yüzden index veritabanlarında yapılan bir çok işlemi ciddi şekilde hızlandırmaktadır. Index'ler ikiye ayrılırlar. Eğer veriler fiziksel olarak sıralanıyor ise Clustered, fiziksel değil ise Non-Clustered index’tir.

Clustered Index (Kümelenmiş) 
Verileri fiziksel ve alfabetik olarak sıralar. (Örn : Telefon rehberi) Bu tip indexler B-Tree yapısına sahiptir. Verilerin oluştuğu sayfalara pointer(işaretleyici) kullanarak gitmesine gerek kalmadan verinin direk yerine ulaşabilir. Kümelenmiş bir index kullanıldığında ulaşılan yer verinin kendisidir. Eğer tabloda Primary Key (Birincil anahtar) var ise bu kümelenmiş index yapısına sahiptir. Her tabloda en fazla bir tane bulunabilir. Clustered Index yapılan kolon artan veya azalan bir değere sahip olmalıdır.

Non-Clustered Index 
Index oluşturuğumuz verilerin ayrıca sıralandığı ve bu veriler üzerinde arama yapılan index türüdür. Index üzerinde arama yapıldıktan sonra bulunan verinin bellekteki fiziksel yerine gitmek için pointer'lar kullanılır. Bu index türünden tablomuzda çok sayıda olabilir. Örnek verecek olursak bir kitabın içindekiler kısmını kullanarak çok daha hızlı bir şekilde aradığımız sayfayı bulabiliriz. Burada yapılan kitabın içindeki başlıklar üzerinde bir index oluşturmaktır. Daha sonra pointer(sayfa numarası) ile o başlığın gerçekte bulunduğu sayfaya çok kolay bir şekilde gidebiliriz.

Index Nasıl Tanımlanır?

CREATE INDEX index_adi ON tablo_adi(kolon_adlari)

CREATE UNIQUE INDEX index_adi ON tablo_adi(kolon_adlari)  

Not! Unique index tanımladığımızda index tanımlanan her verinin bir tane olması gerekir.

Index Nasıl Silinir?

DROP INDEX index_adi


1 comment: