Mysql Query Optimizasyonu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek

    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?


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek

    bi ihtimal up


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ★★★★
    Genki
    Genki's avatar
    Kayıt Tarihi: 24/Ağustos/2005
    Erkek

    Mysql tarafını bilemeyeceğimde, sunucu tarafında okuma/yazma hızı ne alemde, hiç test yaptın mı hocam ?

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek
    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 :)


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Claw
    Claw's avatar
    Kayıt Tarihi: 30/Temmuz/2015
    Erkek

    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


    Real Eyes Realize Real Lies
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek
    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


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek

    Çö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)


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    tagext
    tagext's avatar
    Üstün Hizmet Madalyası Başarı Madalyası
    Kayıt Tarihi: 25/Temmuz/2002
    Erkek

    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.


    ftw
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Bektas
    x-files
    x-files's avatar
    Kayıt Tarihi: 06/Eylül/2005
    Erkek

    Opencart mı


    //Hayat Bazen Tatlıdır//--//Aşıksan vur saza şoförsen bas gaza// https://zulfumehmet.com/ Kişisel bir olay
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek
    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.


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    TeRRoR
    TeRRoR's avatar
    Kayıt Tarihi: 06/Nisan/2007
    Erkek
    x-files bunu yazdı

    Opencart mı

    Yok dostum kendi geliştirdiğimiz bir uygulama.


    herkes programcı olmak zorunda değildir, lütfen bir zorunluluk gibi programlama dilleri öğrenmeye çalışmayın. yabancı dil filan öğrenin amq.// s.kimin etini yerim, kasaba minnet etmem.// ince düşünene kalın girer.//
Toplam Hit: 1534 Toplam Mesaj: 11
mysql mysql performans mysql optimizasyon