Mysql Query Optimizasyonu
-
MySQL 8.0.16 versionu kullanıyorum. Aşağıdaki sorguda yavaşlık vardı. Index oluşturmadığım için yavaş olduğu için aşağıdaki şekilde indexler oluşturdum. Sonrasında sorgunun hızında bir değişiklik olmadığı için EXPLAIN ile sorgu planını gözden geçirip birazda araştırdığımda oluşturduğum indexlerin kullanılmadığı kanaatine vardım. (Bu konuda bir sorun olabilir mysql tarafında optimizasyon yapmadım daha önce, birde işin içine join girince işler değişiyor olabilir.)
Sorgu:
select `products`.* from `product_filter`
inner join `products` on `products`.`id` = `product_filter`.`product_id`
where `product_filter`.`brand_id` = 5 and `is_active` = 1 group by `product_id` limit 5 offset 0;
Oluşturduğum Indexler:
Tablo:
products
Indexler:
products_is_active_IDX (BTree) (is_active kolonu için)
Tablo:
product_filter
Indexler:
product_filter_brand_id_IDX (BTree) (brand_id kolonu için)
EXPLAIN Sonucu:
https://paste.ubuntu.com/p/SjjjNpnFtW/
Araştırmalarıma göre "key" kolonu altında yazan index'ler query esnasında kullanılmış olanlar. Yukardaki sonuçta da gözüktüğü gibi sadece PK için oluşturulan key kullanılıyor. Normalde onun yanında product_filter_brand_id_IDX indexininde kullanılması gerekiyor. Aynı şekilde products tablosun içinde products_is_active_IDX indexi kullanılması gerekiyor ancak onuda kullanmıyor. Kafa gitti yani.
Nerede hata yapıyorum anlayamadım?
-
bi ihtimal up
-
Mysql tarafını bilemeyeceğimde, sunucu tarafında okuma/yazma hızı ne alemde, hiç test yaptın mı hocam ?
-
Genki bunu yazdı
Mysql tarafını bilemeyeceğimde, sunucu tarafında okuma/yazma hızı ne alemde, hiç test yaptın mı hocam ?
Şu aşamada sunucu kaynakları ve mysql'in konfigurasyon optimizasyonundan önce query deki saçma index kullanamam problemini çözmeyi düşündüğüm için hiç oralara bakmadım. Çünkü çok basit birşey 3m'lik bir tabloya sorgu atıyorsan önce bi indexlerin düzgün ayarlanması gerektiğini düşünüyorum :)
-
select `products`.* from bu kısımda products ta ki tüm sütunları almışsın buradan sadece işe yarayanları alırsan daha iyi olur ve en çok where sorgusu yaptığın sütunları indexlemen lazım diye biliyorum
-
Claw bunu yazdı
select `products`.* from bu kısımda products ta ki tüm sütunları almışsın buradan sadece işe yarayanları alırsan daha iyi olur ve en çok where sorgusu yaptığın sütunları indexlemen lazım diye biliyorum
Hocam .* dan sonraki muhabbeti biliyorum. Ancak şu aşamada oradaki kolonları optimize etmemin faydası yok ne yazikki. Where sorgusu içinde kullandığım kolonları indexlemiş olmama rağmen bir şekilde o indexleri kullanmıyor meret :S
-
Çözdüm hacılar. Güzel güzel where'den sonra gelen kolonlara index atarız diye gülüp geçiyordukta hiç group by dan sonraki kolonlar aklımıza gelmemiş hiçbirimizin :) brand_id ve product_id için product_filter tablosunda birleşik index attım, EXPLAIN sonucu artık index kullandığı gözüküyor.
Selam ve dua ile (f)
-
Query yazarken birkaç şeye dikkat etmen lazım. Query filterların where join vs ve onun sonunda dönen data üzerinde yapacağın işlemler group by analitik fonksiyonlar window fonksiyonları. Indeks koymak insertlerini hatta querylerini yavaşlatabilir. Indeks te bir tablodur. Senin 1gb tablon varsa yanına 500mb indeks eklemiş olabilirsin. Bu sefer 100m kayıta çıktığında gol yersin. İlk indeks e force etmesini istiyorsan indeks hint vermen daha doğru olur.
https://dev.mysql.com/doc/refman/8.0/en/index-hints.html#:~:targetText=The%20FORCE%20INDEX%20hint%20acts,index%20names%2C%20not%20column%20names.
-
Opencart mı
-
tagext bunu yazdı
Query yazarken birkaç şeye dikkat etmen lazım. Query filterların where join vs ve onun sonunda dönen data üzerinde yapacağın işlemler group by analitik fonksiyonlar window fonksiyonları. Indeks koymak insertlerini hatta querylerini yavaşlatabilir. Indeks te bir tablodur. Senin 1gb tablon varsa yanına 500mb indeks eklemiş olabilirsin. Bu sefer 100m kayıta çıktığında gol yersin. İlk indeks e force etmesini istiyorsan indeks hint vermen daha doğru olur.
https://dev.mysql.com/doc/refman/8.0/en/index-hints.html#:~:targetText=The%20FORCE%20INDEX%20hint%20acts,index%20names%2C%20not%20column%20names.
Aynen index'in insert,update,delete de dezavantaj yaratacağı durumların farkındayım. Ancak bu tablom statikden hallice olacak (kullanıcı tarafından insert-update edilemeyecek). Aslında en güzeli solr'a yada elastice indexletip oradan çatır çatır çekmek var ancak şuanda bu şekilde ilerlemek zorundayım ne yazikki. Şu durumda zaten tablonun kendi boyutundan fazla index boyutu oluşacak gibi daha 5 tane daha ekstra index oluşturmam gerekecek :S Index hint'i denemiştim yinede index vurmamıştı ve normalmiş indexleri yanlış oluşturmuşum. Teşekkürler tekrardan.
-
x-files bunu yazdı
Opencart mı
Yok dostum kendi geliştirdiğimiz bir uygulama.