Dizinler, sorgu optimizasyonunda ve sonuçları tablolardan hızlı bir şekilde aramada önemli bir rol oynayabilir. Bu nedenle, hangi sütunların dizine ekleneceğini seçmek en önemli adımdır. İndekslemeyi düşünebileceğimiz iki ana yer vardır: WHERE yan tümcesinde referans verilen sütunlar ve JOIN yan tümcelerinde kullanılan sütunlar. Kısacası, belirli kayıtları aramanız gereken bu tür sütunlar dizinlenmelidir. Diyelim ki, SELECT sorgusunun aşağıdaki gibi dizinleri kullandığı alıcılar adlı bir tablomuz var:
SELECT
buyer_id
FROM buyers
WHERE first_name='Tariq'
AND last_name='Iqbal'
SELECT kısmında "alıcı_kimliği" belirtildiğinden, MySQL onu seçilen satırları sınırlamak için kullanmayacaktır. Bu nedenle, dizine eklemeye çok gerek yoktur. Aşağıdakiler, yukarıdakinden biraz farklı başka bir örnektir:
SELECT
buyers.buyer_id,
country.name
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id
WHERE
first_name='Tariq'
AND
last_name='Iqbal'
Yukarıdaki sorgulara göre first_name, last_name sütunları WHERE yan tümcesinde bulundukları için dizine alınabilir. Ayrıca, ülke tablosundaki country_id adlı ek bir alan, JOIN yan tümcesinde yer aldığından indeksleme için düşünülebilir. Dolayısıyla, indeksleme, WHERE yan tümcesi veya bir JOIN yan tümcesindeki her alanda düşünülebilir.
Aşağıdaki liste, tablolarınızda indeksler oluşturmayı düşündüğünüzde her zaman aklınızda bulundurmanız gereken birkaç ipucu da sunar:
- Yalnızca WHERE ve ORDER BY yan tümcelerinde gerekli olan sütunları dizine ekleyin. Sütunları bolca indekslemek bazı dezavantajlara neden olacaktır.
- MySQL'in "dizin öneki" veya "çok sütunlu dizin" özelliğinden yararlanmaya çalışın. INDEX (ad, soyad) gibi bir dizin oluşturursanız, INDEX (ad_adı) oluşturmayın. Ancak, tüm arama durumlarında "dizin öneki" veya "çok sütunlu dizin" önerilmez.
- NULL değerlerin hiçbir zaman depolanmaması için, indekslemeyi düşündüğünüz sütunlar için NOT NULL özniteliğini kullanın.
- Dizin kullanmayan sorguları günlüğe kaydetmek için --log-long-format seçeneğini kullanın. Bu şekilde bu log dosyasını inceleyebilir ve sorgularınızı buna göre ayarlayabilirsiniz.
- EXPLAIN ifadesi, MySQL'in bir sorguyu nasıl yürüteceğini ortaya çıkarmanıza yardımcı olur. Tabloların nasıl ve hangi sırayla birleştirildiğini gösterir. Bu, optimize edilmiş sorguların nasıl yazılacağını ve sütunların dizine eklenmesinin gerekip gerekmediğini belirlemek için çok yararlı olabilir.
Güncelleme (23 Şub'15):
Herhangi bir dizin (iyi / kötü), ekleme ve güncelleme süresini artırır.
Dizinlerinize (dizin sayısı ve türü) bağlı olarak sonuç aranır. Arama süreniz indeks nedeniyle artacaksa, bu kötü indekstir.
Muhtemelen herhangi bir kitapta, "Dizin Sayfası" bölüm başlangıç sayfasına, konu sayfa numarasının başlamasına ve ayrıca alt konu başlığına sahip olabilir. Dizin sayfasındaki bazı açıklamalar yardımcı olabilir, ancak daha ayrıntılı dizin kafanızı karıştırabilir veya sizi korkutabilir. Dizinler de hafızaya sahiptir.
Dizin seçimi akıllıca olmalıdır. Tüm sütunların indeks gerektirmediğini unutmayın.