Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

MySQL index nedir?​


MySQL index, bir tablodaki satırları belirli sütun değerlerine göre daha hızlı bulmaya yarayan yardımcı veri yapısıdır. Kitabın başındaki dizin gibi çalışır: MySQL uygun bir index kullandığında tablonun her satırını tek tek taramak yerine aradığı değerlere doğrudan yaklaşabilir. Bunun karşılığında index disk alanı kullanır ve ekleme, güncelleme veya silme işlemlerinde güncellenmesi gerektiği için yazma maliyeti oluşturur.

Index özellikle WHERE, JOIN, ORDER BY ve bazı GROUP BY sorgularında yararlıdır. Ancak her index otomatik olarak kullanılmaz. MySQL sorgunun maliyetini değerlendirir; tablo küçükse, koşul çok fazla satır döndürüyorsa veya sorgu index yapısına uygun değilse tablo taramasını seçebilir.

Çalışma mantığı ve temel türler​


Bir index, seçilen sütunun değerlerini ve ilgili satıra erişim bilgisini düzenli bir yapıda tutar. Örneğin email = '[email protected]' koşulu için email sütununda index varsa, MySQL bütün kullanıcıları okumadan eşleşen kaydı arayabilir.

En sık kullanılan index türleri şunlardır:

  • PRIMARY KEY: Satırı benzersiz tanımlar. Bir tabloda tek bir primary key bulunur.
  • UNIQUE: NULL olmayan aynı anahtar değerinin tekrarını engeller; NULL kabul eden sütunlarda birden fazla NULL bulunabilir. Aramalarda da kullanılabilir.
  • Normal index: Aramayı hızlandırır fakat değerlerin tekrarlanmasına izin verir.
  • Bileşik index: Birden fazla sütunu birlikte indexler. Sütun sırası önemlidir.

Aynı sütuna gereksiz şekilde birden fazla benzer index eklemek fayda sağlamaz. Ayrıca index, verinin kendisinin yerine geçmez; sonuç satırlarını yine tablodan okumak gerekebilir.

Çalıştırılabilir örnek​


Aşağıdaki örnek mevcut veritabanındaki kalıcı tabloları değiştirmez. Geçici tablo yalnızca açık olan veritabanı bağlantısı boyunca kullanılabilir. Aynı adlı geçici tablo zaten varsa onu silmeyin; örnek tablo adını değiştirip tüm sorgularda aynı yeni adı kullanın.

  1. Test sorgularını çalıştırabileceğiniz bir MySQL veritabanı bağlantısı açın.
  2. Aşağıdaki tam örneği aynı oturumda çalıştırın:

Kod:
CREATE TEMPORARY TABLE demo_orders (
    id INT NOT NULL AUTO_INCREMENT,
    customer_id INT NOT NULL,
    status VARCHAR(20) NOT NULL,
    created_at DATE NOT NULL,
    PRIMARY KEY (id),
    INDEX idx_orders_customer_status (customer_id, status)
);

INSERT INTO demo_orders (customer_id, status, created_at) VALUES
    (10, 'paid', '2026-01-10'),
    (10, 'pending', '2026-01-11'),
    (20, 'paid', '2026-01-12');

EXPLAIN
SELECT id, created_at
FROM demo_orders
WHERE customer_id = 10
  AND status = 'paid';

Başarıyla çalışırsa tablo oluşturulur, örnek satırlar eklenir ve EXPLAIN sorgu planını gösterir. Çıktıda key sütununun idx_orders_customer_status olması, optimizer'ın bu indexi kullanmayı seçtiğini gösterir. key değeri NULL ise bu tek başına hata değildir; örnek veri az olduğu için tablo taraması daha ucuz görülmüş olabilir. Gerçek tabloda karar vermek için gerçek veri dağılımıyla EXPLAIN sonucunu inceleyin.

Sorgu başarısız olursa önce tüm komutları aynı bağlantıda çalıştırdığınızı ve geçerli bir veritabanı seçtiğinizi kontrol edin. Geçici tablo başka bir bağlantıda görünmez. Üretim tablosuna index eklemeden önce sorgu planını ve yazma yükünü ayrıca değerlendirin.

Index ekleme ve karar verme​


Kalıcı bir tabloya örnek olarak şu komut kullanılabilir:

Kod:
CREATE INDEX idx_orders_customer_status
ON orders (customer_id, status);

Uygularken şu sırayı izleyin:

  1. Yavaş olan gerçek sorguyu belirleyin; yalnızca sütun çok kullanılıyor diye index eklemeyin.
  2. Sorgunun WHERE, JOIN ve sıralama sütunlarını inceleyin.
  3. Index eklemeden önce ve sonra EXPLAIN ile planı karşılaştırın.
  4. Bileşik indexte daha erken yazılan sütunun sorguda nasıl kullanıldığını kontrol edin.
  5. Kullanılmayan veya birbirinin aynısı olan indexleri gözden geçirin; kaldırmadan önce ilgili sorguları doğrulayın.

Bileşik indexte sol baştaki sütunlar belirleyicidir. (customer_id, status) indexi, yalnız customer_id ile yapılan aramada genellikle yararlı olabilir; yalnız status ile yapılan aramada aynı avantajı sağlamayabilir.

Aşağıdaki karşılaştırma, yaygın seçimleri özetler:

İhtiyaçUygun yaklaşımDikkat edilmesi gereken
Benzersiz kayıt kimliğiPRIMARY KEYHer tablo için uygun ve kararlı bir anahtar seçin
Tek sütunda sık aramaNormal indexÇok fazla aynı değer varsa kazanç sınırlı olabilir
Birlikte kullanılan koşullarBileşik indexSütun sırası sorgu biçimine uymalıdır
Tekrarsız olması gereken değerUNIQUE indexMevcut tekrarlar ekleme işlemini başarısız kılabilir

Sık yapılan hatalar​


Bütün sütunlara index eklemek doğru bir yaklaşım değildir. Her ek index yazma işlemlerini ağırlaştırabilir ve depolama kullanır. Ayrıca LIKE '%metin' gibi başında joker karakter bulunan aramalar, sütun üzerinde hesaplama yapılan koşullar ve tür dönüşümü gerektiren karşılaştırmalar beklenen index avantajını azaltabilir.

Bir başka hata, yalnız EXPLAIN çıktısındaki key alanına bakıp sorgunun kesinlikle hızlı olduğunu varsaymaktır. Dönen satır tahmini, taranan satır sayısı ve sorgunun gerçek çalışma süresi birlikte değerlendirilmelidir. Index eklemek sorunu çözmezse sorgunun seçtiği sütunları, gereksiz SELECT * kullanımını ve yanlış join koşullarını da inceleyin.

Sık sorulan sorular​


Index sorgu sonucunu değiştirir mi?​


Mantıksal olarak aynı sorgu aynı satırları hedefler; fakat ORDER BY yoksa satırların sırası garanti değildir ve index seçimi görünür sırayı değiştirebilir. LIMIT ile sabit bir sıra gerekiyorsa benzersizliği de sağlayan ORDER BY kullanın. Index yalnızca bu satırlara erişim yöntemini değiştirmeyi amaçlar. Benzersizliği zorlayan UNIQUE index ise yeni verilerin kabul edilmesini etkileyebilir.

Her tabloda index olmalı mı?​


Primary key gibi temel bir anahtar çoğu tasarımda yararlıdır; bunun dışındaki indexler gerçek sorgu ihtiyacına göre seçilmelidir. Küçük veya nadiren okunan tablolarda çok sayıda index gereksiz olabilir.
 

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