Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 7 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
Bu rehber MySQL 8.4 ve B-tree birleşik indeks mantığını esas alır. Birleşik indekslerde sütun sırası önemlidir çünkü veritabanı indeks kayıtlarını önce ilk sütuna, eşleşen kayıtlar içinde ikinci sütuna göre düzenler. Bu nedenle (musteri_id, durum) indeksi, (durum, musteri_id) ile aynı sorguları aynı verimlilikte desteklemez. Sıra; sorgunun hangi koşulları hızlı kullanabileceğini, sıralamanın indeksten karşılanıp karşılanamayacağını ve gereksiz satır taramasının ne kadar azalacağını etkiler.

Birleşik indeks nasıl çalışır?​


Yalnız size ait ayrı deneme veritabanında, aşağıdaki tablo adı henüz yokken bu küçük örneği hazırlayın. Küçük veri kümesi plan seçimini göstermeyebilir; daha büyük gerçek dağılım için ayrıca ölçüm gerekir:

SQL:
CREATE TABLE index_order_demo (
    id INT PRIMARY KEY,
    musteri_id INT NOT NULL,
    durum VARCHAR(30) NOT NULL
) ENGINE=InnoDB;

INSERT INTO index_order_demo VALUES
(1,42,'hazirlaniyor'), (2,42,'gonderildi'),
(3,7,'hazirlaniyor');

CREATE INDEX idx_siparis_musteri_durum
ON index_order_demo (musteri_id, durum);

Bu yapı önce musteri_id değerlerini gruplar, aynı müşteri içindeki kayıtları da durum değerine göre düzenler. Bu yüzden aşağıdaki sorgu iki sütunu da doğrudan kullanmaya uygundur:

Kod:
SELECT *
FROM index_order_demo
WHERE musteri_id = 42
  AND durum = 'hazirlaniyor';

İlk sütun belirtilmeden yalnızca ikinci sütunu arayan sorgu ise aynı doğrudan sol başlangıç avantajını genellikle elde edemez:

Kod:
SELECT *
FROM index_order_demo
WHERE durum = 'hazirlaniyor';

İkinci sorgu için veritabanının indeksi tamamen veya kısmen taraması gerekebilir. Bunun nedeni, indeksin durum değerlerini baştan bağımsız ve sıralı bir giriş olarak tutmamasıdır. Veritabanı motoru sorgu planına göre başka bir indeks seçebilir veya tablo taraması yapabilir; indeksin varlığı tek başına belirli bir kullanım garantisi vermez.

Somut karşılaştırma​


Aynı tablo üzerinde iki olası indeksin tipik kullanım farkı şöyledir:

İndeks sırasıEn uygun sorgu biçimiGenellikle zayıf kalan sorguTercih edilme nedeni
(musteri_id, durum)Belirli müşterinin belirli durumdaki kayıtlarıYalnızca duruma göre aramaMüşteri filtresi çoğu sorguda önce uygulanıyorsa
(durum, musteri_id)Belirli durumdaki müşterileri bulmaYalnızca müşteriye göre aramaDurum filtresi ortak başlangıç koşuluysa

Buradaki karar yalnızca sütunların seçiciliğine göre verilmemelidir. Asıl ölçüt, uygulamanın gerçek sorgularında hangi koşulların birlikte ve ne sıklıkta kullanıldığıdır. Bir sütunda az sayıda farklı değer bulunması onu otomatik olarak ilk sıraya uygun yapmaz; sorguların kullanım şekli ve tablo büyüklüğü de değerlendirilmelidir.

Sütun sırasını belirleme adımları​


  1. Uygulamanın yavaş veya sık çalışan sorgularını listeleyin. Sadece tablo yapısına bakarak indeks sırası seçmeyin.
  2. Sorgularda birlikte kullanılan eşitlik koşullarını belirleyin. Örneğin WHERE musteri_id = ? AND durum = ? koşulu, bu iki sütunun birlikte değerlendirilmesini gerektirir.
  3. Sıralama ve aralık koşullarını inceleyin. ORDER BY olusturma_tarihi, LIMIT veya tarih >= ? gibi parçalar sütun sırasını değiştirebilir.
  4. En sık ortak başlangıç filtresini indeksin başına koymayı deneyin. Örneğin sorguların çoğu önce musteri_id ile daralıyorsa (musteri_id, durum) daha uygun adaydır.
  5. İndeksi oluşturduktan sonra SELECT’in başına EXPLAIN koyarak planı inceleyin. key, type ve tahmini rows alanlarını birlikte okuyun; yalnız indeksin varlığına değil, beklenen satır sayısının ve tarama yönteminin sorguya uygun olup olmadığını değerlendirmek için kullanılır.
  6. İndeksin ekleme, güncelleme ve depolama maliyetini de kontrol edin. Her yeni indeks yazma işlemlerinde güncellenir; aynı sütunları farklı sırayla içeren gereksiz indeksleri korumayın.

Yaygın hatalar​


İlk hata, iki indeksin sütunları aynı olduğu için eşdeğer sanılmasıdır. (a, b) ile (b, a) farklı erişim yollarıdır. İkinci hata, yalnızca sütunun benzersizliğine bakıp sıralama yapmaktır. Daha seçici görünen sütun her sorguda ilk sırada olmak zorunda değildir.

Bir diğer hata, sorgunun yazılışını indeks sırasından bağımsız değerlendirmektir. WHERE b = ? AND a = ? ifadesindeki koşul sırası, indeksin fiziksel sütun sırasını değiştirmez; önemli olan koşulların hangi sütunları kapsadığıdır. Ancak yalnızca birleşik indeksin ikinci sütununu kullanan sorgu, ilk sütun olmadan aynı faydayı görmeyebilir.

Son olarak, indeks tanımını değiştirdikten sonra sorgu planını ve gerçek çalışma süresini kontrol etmeden karar vermeyin. Uygulama sorguları değiştiğinde en iyi sütun sırası da değişebilir.

Sık sorulan sorular​

İlk sütun koşulu yoksa indeks hiçbir zaman kullanılamaz mı?​

Bu kadar kesin değil. İndeksin tamamını tarama veya MySQL’in koşullarını sağlayan sorgularda Skip Scan gibi yollar mümkün olabilir. Bunlar doğrudan sol önek aramasıyla aynı maliyet değildir. Gerçek planı inceleyin; yalnız indeks tanımından kesin hız sonucu çıkarmayın.

EXPLAIN ile EXPLAIN ANALYZE aynı etkiye mi sahiptir?​

EXPLAIN tahmini planı gösterir; EXPLAIN ANALYZE sorguyu gerçekten çalıştırarak ölçüm üretir. Ağır bir sorgunun canlıda ölçülmesinin yük oluşturabileceğini hesaba katın. Bu rehberdeki küçük denemeyi üretim verisinde indeks yaratma veya silme talimatı gibi uygulamayın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic