Veritabanlarında indeks, verilerin arama, sıralama ve filtreleme işlemlerini hızlandıran veri yapısıdır. MySQL’de B‑Tree, Hash ve Full‑Text gibi farklı indeks türleri bulunur. İndeks, tablo satırlarını doğrudan fiziksel olarak değil, bir arama ağacı içinde sıralar ve sorgu planlayıcısına hangi satırların hedef olduğunu hızlıca belirtir.
İndeks Türleri ve Kullanım Alanları
MySQL’de en yaygın kullanılan indeks türleri şunlardır:
- BTREE (varsayılan): Sıralama ve arama için ideal.
- HASH: MEMORY tablosu için, eşleşme aramaları.
- FULLTEXT: Metin aramaları, LIKE '%kelime%' yerine kullanılır.
- SPATIAL: Coğrafi veri için.
İndeks Oluşturmanın Temel Sentezi
İndeks eklemek için CREATE INDEX komutu kullanılır. Örnek:
CREATE INDEX idx_customer_city
ON customers (city);
Bu, customers tablosundaki city sütununa B‑Tree indeks ekler.
Birden Fazla Sütunlu (Composite) İndekslerin Avantajı
Composite indeksler, sorgularda birden fazla sütun kullanıldığında performansı artırır. Örneğin:
CREATE INDEX idx_order_date_status
ON orders (order_date, status);
Bu indeks, order_date ile başlayan ve status ile devam eden WHERE koşullarını hızlıca çözer.
Unique İndekslerin Rolü
UNIQUE indeks, sütun değerlerinin benzersiz olmasını garanti eder ve aynı zamanda arama hızını artırır. PRIMARY KEY de bir unique indeksdir. Örnek:
ALTER TABLE users
ADD UNIQUE (email);
Bu, e-posta adresi tekrarını engeller ve sorgu performansını iyileştirir.
Full‑Text İndeks ile Metin Aramaları
FULLTEXT indeks, büyük metin alanlarında arama yaparken LIKE yerine kullanılır. Örnek:
ALTER TABLE articles
ADD FULLTEXT (title, body);
Sorguda MATCH…AGAINST kullanılır:
SELECT * FROM articles
WHERE MATCH (title, body) AGAINST ('veritabanı' IN NATURAL LANGUAGE MODE);
Bu, metin içinde arama yaparken B‑Tree’den çok daha hızlıdır.
İndeks Seçiminde Sütun Düzeyi ve Boyut
İndeks eklenirken sütun boyutu önemlidir. Uzun VARCHAR, TEXT gibi sütunlar yerine, ilk 100 karakter gibi bir kısım indekslenir. MySQL 5.7+’de prefix indeksleme ile:
CREATE INDEX idx_name
ON customers (name(50));
Bu, 50 karakterli bir prefix ile indeks oluşturur ve disk alanını azaltır.
İndeks Sıralaması ve Sorgu Planı
İndekslerin sırası, WHERE, JOIN ve ORDER BY ifadelerinde kritik rol oynar. Sorgu planlayıcı, en uygun indeksleri seçer. EXPLAIN komutu ile planı inceleyebilirsiniz:
EXPLAIN SELECT * FROM orders
WHERE order_date = '2024-01-01'
AND status = 'shipped';
Bu, kullanılan indeksin hangi sütunları kapsadığını gösterir.
İndeks Bakımı ve Yeniden Oluşturma
Veri ekleme, güncelleme ve silme işlemleri indeksleri parçalı yapar. OPTIMIZE TABLE komutu ile indeksleri yeniden düzenleyebilirsiniz:
OPTIMIZE TABLE orders;
Bu, disk alanını geri kazanır ve arama performansını korur.
İndeks Kullanımında Dikkat Edilmesi Gerekenler
İndeks eklemek her zaman iyi değildir. Çok sayıda indeks, INSERT/UPDATE performansını düşürür. İndeksleri yalnızca sık kullanılan WHERE, JOIN ve ORDER BY sütunları için ekleyin. İndeks maliyetini ve faydasını dengelemek için:
- İndeks büyüklüğünü kontrol edin.
- İndeks kullanımını EXPLAIN ile izleyin.
- İhtiyaç duyulmayan indeksleri kaldırın.
İndekslerin Ölçeklenmesi ve Partitioning
Büyük tablolar için partitioning ile indeksleri bölmek performansı artırır. Örnek:
ALTER TABLE orders
PARTITION BY RANGE (YEAR(order_date))
(PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025));
Her partition ayrı indeks setine sahip olur ve sorgular sadece ilgili partition’a hitap eder.
Pratik Örnek: Performanslı Sorgu Tasarımı
Örnek tablo: users (id PK, email, last_login). Sorgu: son 7 gün içinde giriş yapan kullanıcıları bulmak. İndeks önerisi:
CREATE INDEX idx_last_login
ON users (last_login);
Sorgu:
SELECT id, email FROM users
WHERE last_login >= NOW() - INTERVAL 7 DAY;
Bu indeks, tarih aralığı sorgusunu B‑Tree ile hızlıca çözer.
İndekslerin SEO ile Bağlantısı
Web uygulamalarında veritabanı performansı, sayfa yükleme süresini etkiler. Hızlı sorgular, Google’ın PageSpeed Insights skorunu yükseltir. İndekslerin doğru kullanımı, kullanıcı deneyimini iyileştirir ve SEO sıralamalarını olumlu yönde etkiler.
Sonuç
MySQL indeksleri, veritabanı performansının temel taşlarından biridir. Doğru indeks seçimi, sorgu planlama ve bakım ile uygulamanızın hızını katlanarak artırabilirsiniz. İndeksleri planlı ekleyip, gereksizleri kaldırarak hem veri erişim hızı hem de sistem kaynakları üzerinde optimum denge kurabilirsiniz.