Ana içeriğe geç
Modül 10 · Ders 1 ders 4Kurstaki 37/57~15 min
Modül dersleri (1/4)

İndeksler ve B-Ağaçları

Bir veritabanı milyonlarca satır arasından tek bir kaydı saniyenin kesirleri kadar sürede nasıl bulabilir?

Varsayılan olarak, SELECT * FROM customers WHERE city = 'Milano' diye sorduğumuzda Postgres'in Sıralı Tarama yapması gerekir: fiziksel olarak tüm tabloyu diskten satır satır okur ve her şehri "Milano" ile karşılaştırır. Bir tablo milyonlarca kayıt barındırdığında bu süreç performansı sekteye uğratır.

Bu darboğazların ana yapısal yanıtı Endeksler'dir.

Endeksler (B-Ağaçlar)

Dizinler tam olarak büyük bir kitabın arkasındaki analitik dizin gibi çalışır. "Milano"dan nerede bahsedildiğini bulmak için kitabın tamamını okumak yerine, "Milano" kelimesinin bizi [p. 45, 114, 230]'ye yönlendirdiği arka sayfalara bakarız. Veritabanları, perde arkasında, eşleşen satırların fiziksel depolamasına doğrudan işaretçiler içeren, söz konusu sütun veya sütunlara göre sıralanan bu ayrı, çok kompakt veri yapısını (genellikle bir "B-Ağacı") oluşturur.

SQL
-- Creare un indice semplice
CREATE INDEX idx_customers_city ON customers(city);

Bu tek işlem, arka planda tüm city değerlerini çıkarıp dizine ekleyecek olan Postgres motorunu tetikler. Tamamlandığında, sonraki tüm SELECT ... WHERE city = '...' uçacak!

Birincil anahtarlar ve benzersizlik

Birincil anahtarın (PRIMARY KEY) ve UNIQUE anahtar kurallarının gizli olarak dizinleri kullandığını biliyor muydunuz? Veritabanının, satır eklerken veya değiştirirken bir e-postanın veya kimliğin asla kopyalanmamasını sağlaması gerektiğinden, PostgreSQL bunların üzerinde otomatik olarak örtülü bir B-Tree dizini oluşturur: bu şekilde benzersizlik kontrolleri mikrosaniyeler alır.

Bu nedenle ID alanındaki birleştirmeler inanılmaz derecede performanslıdır.

Bir indeksi bırakmak

Ağır sorguların değiştiğini ve bir dizine asla başvurulmadığını fark ederseniz, onu yok etmek ve hayati alanı geri kazanmak akıllıca olacaktır:

SQL
DROP INDEX idx_customers_city;

Sıra sende

Egzersiz#sql.m10.l1.e1
Denemeler: 0Yükleniyor…

E-ticaretimizde, kontrol panelleri aracılığıyla müşterileri sıklıkla uyruğa (müşterilerdeki ülke sütunu) göre filtrelediğimizi fark ediyoruz. \nÜlke sütununda yeni bir temel dizin oluşturun ve bunu 'idx_customers_country' olarak adlandırın.

Düzenleyici yükleniyor…
İpucu göster

CREATE INDEX indeks_adı ON tablo_adı(sütun_adı); kullanın

3 denemeden sonra çözüm mevcut

İkincil benzersiz dizinleri keşfetme

Egzersiz#sql.m10.l1.e2
Denemeler: 0Yükleniyor…

B-Tree dizini, oluşturma sırasında UNIQUE kısıtlamasını simüle etmek ve mantıksal amacı açık ve zorunlu hale getirirken aramaları hızlandırmak için de kullanılabilir.\n\nUNQUE anahtar sözcüğünü bildirdiğiniz yeni bir dizin oluşturun. Bunu, diğer kullanıcıların istenmeyen yinelenen kayıtlarını engelleyecek, 'müşteriler'in 'e-posta' sütununda benzersizliği zorlayacak şekilde tanımlayın ve 'idx_unique_email_customer' olarak adlandırın.

Düzenleyici yükleniyor…
İpucu göster

CREATE UNIQUE INDEX indeks_adı ON tablosuna (sütun) yazın;

3 denemeden sonra çözüm mevcut