Genel
MySQL'de Min/Max ve Gruplama Sorgularının Optimizasyonu
Veritabanında min/maks sorguları optimize etmek için dizinleri kullanabilirsiniz. Veriler dizinler üzerinde sıralandığından, dizinler verilerin min veya maks değerini döndürmek için kullanılabilir.
Örneğin, MySQL'deki aşağıdaki sorguda, product_orders tablosundan maksimum sipariş tarihini seçmek istiyorsunuz. MYSQL optimizer önce tüm ürün siparişleri tablosunu tarar, ardından maksimum sipariş tarihini bulmak için Aggregate max operatörünü uygular. Bu plan, tablonuz büyükse çok verimsizdir ve maliyet yaklaşık 1.650.000'dır.

Dizinsiz Maksimum Sorgu Yürütme Planı
Ancak sipariş_tarihi üzerinde bir dizin oluşturursanız, yeni plan aşağıdaki gibi olacaktır. Çok hızlı olduğundan maliyet sıfırdır ve sorgu anında döner.

Dizin Oluşturduktan Sonra Maksimum Sorgu Yürütme Planı
Bu örnekler kolaydır, peki ya "group by" devreye girerse? Örneğin, her ülke için maksimum sipariş tarihini sorgulamak isterseniz. Sorgu ve yürütme planı aşağıdaki gibi olacaktır. Maliyet 546.755, bu da oldukça yüksektir.

Gruplama ile Dizinsiz Maksimum Sorgu Yürütme Planı
Peki ya ülke_id, sipariş_tarihi bileşik dizini oluşturursanız? O zaman sorgunun maliyeti 546.755'ten 138'e düşer. Bu, yaklaşık 4000 kat daha hızlı anlamına gelir.

Peki, ürün7'nin satıldığı her ülke için maksimum tarih ne olacak diye sormak isterseniz.

Ürün7'nin satıldığı her ülke için maksimum tarih
Hâlâ dizin kullanılıyor. Ancak bu verimli mi? Hayır. Maliyet yüksektir ve tabloda her sıra için yürütme planında ürün7 için filtreleme yaşanır ki bu çok verimsizdir. Önemli olan, bir planın dizin kullanması, performans açısından uygun olduğu anlamına gelmez.
Optimal dizin, product_name, ülke_id, sipariş_tarihi bileşik dizini olacaktır. Ve sütunların sırası önemlidir. Önce where koşulundaki filtrelenmiş sütunlar, ardından gruplama ve son olarak sıralama sütunları olmalıdır. Dizin oluşturduktan sonra, maliyet 660496'dan 3124'e düşer. Bu, 200 kat daha hızlıdır.







