Dizin yokken veritabanı bir soruyu yanıtlamak için her satırı okur. Doğru dizinle doğrudan yanıta atlar. Büyük bir tabloda fark saniyelerle mikrosaniyeler arasındadır — ve yanlış dizin hiç dizin olmamasından kötüdür, çünkü yazmalara mal olur ve karşılığında hiçbir şey vermez.
SÜZDÜĞÜNÜZ şeyi dizinleyin
WHERE koşulu, sonra ORDER BY, sonra birleştirme sütunları. SELECT ile çektikleriniz değil — arama onları kullanmaz.
SELECT * FROM orders WHERE customer_id = 42 ORDER BY created_at DESC;
CREATE INDEX idx_orders_customer_created ON orders (customer_id, created_at);
Bileşik dizinde sıra önemlidir
Bileşik dizin soldan sağa kullanılabilir; tıpkı önce soyada, sonra ada göre sıralanmış bir telefon rehberi gibi. Böyle sıralıyken soyadı Ali olan herkesi bulabilirsiniz; adı Mehmet olan herkesi bulamazsınız.
(customer_id, created_at), customer_id üzerindeki bir süzgece ve ikisi üzerindeki bir süzgece hizmet eder.- Tek başına created_at üzerindeki bir süzgece hizmet ETMEZ.
- Tam eşleşmeyle süzdüğünüz sütunu başa, aralığı ya da sıralamayı ikinci sıraya koyun.
Kullanıldığını kanıtlayın
EXPLAIN SELECT * FROM orders WHERE customer_id = 42;
type: ref ya da const, dizinin kullanıldığı anlamına gelir. type: ALL ise tam tarama demektir ve dizin yok sayılıyordur — genelde sütun bir işlevin içine sarıldığı için.
WHERE DATE(created_at) = "2026-01-01", created_at üzerindeki bir dizini kullanamaz: işlevin önce her satırda çalışması gerekir. Onun yerine bir aralık olarak yazın: created_at >= "2026-01-01" AND created_at < "2026-01-02".Neden her şeyi dizinlememeli
- Her dizin, her INSERT, UPDATE ve DELETE işleminde güncellenir. On dizin, yazmaları kat kat yavaşlatır.
- Disk yer kaplarlar, bazen tablonun kendisinden de fazla.
- Planlayıcının seçeneği artar ve ara sıra daha kötüsünü seçer.