Veritabanı sorgusu daha fazla nasıl hızlandırılır?

Sorguyu hızlandırmak için önerisi olanlar bildiklerini paylaşabilir mi ?

SELECT
alim_bilgileri.*,
alim_bilgileri. İd as aid,
expertiz.*,
expertiz. İd as eid,
stok.*,
(SELECT COUNT(loger. İd) FROM loger WHERE arac_id = stok. İd and IFNULL(goruldu, 0) = 0 ) ykga_adet,
(SELECT SUM(masraf. Tutar) FROM masraf WHERE arac_id = stok. İd and tip='GELİR') gelir_tutar,
(SELECT SUM(masraf. Kdv) FROM masraf WHERE arac_id = stok. İd and tip='GELİR') gelir_kdv,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GELİR') gelir_toplam,
(SELECT SUM(masraf. Tutar) FROM masraf WHERE arac_id = stok. İd and tip='GİDER') gider_tutar,
(SELECT SUM(masraf. Kdv) FROM masraf WHERE arac_id = stok. İd and tip='GİDER') gider_kdv,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER') gider_toplam,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi = ('FİNANSMAN')) finansal,
(SELECT COUNT(masraf. İd) FROM masraf WHERE arac_id = stok. İd and IFNULL(pk, 0) = 0 and tip IN ('GİDER','GELİR') and sanal != 1) kontrol_onay,
(SELECT COUNT(masraf. İd) FROM masraf WHERE arac_id = stok. İd and IFNULL(pk, 0) = 0 and tip IN ('GİDER','GELİR') and sanal = 1) sanal_kontrol_onay,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi IN ('TRAFİK SİGORTASI','Trafik Zeyil')) trafik,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi LIKE ('MTV%')) mtv,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and sanal = 1 and gider_tipi!='BANKA KATKISI') sanal,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and sanal = 1 and gider_tipi='BANKA KATKISI') banka,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi='İLAVE AKSESUAR') ilave_aksesuar,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and masraf_grup='30 ATÖLYE MSRF') atolye_masraf,
(SELECT SUM(masraf. Toplam) FROM masraf WHERE arac_id = stok. İd and tip='GELİR' and masraf_grup='30 ATÖLYE MSRF') atolye_masraf_gelir,

(SELECT COUNT(id) FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi LIKE ('MTV%')) mtv_adet,
(SELECT gider_tarihi FROM masraf WHERE arac_id = stok. İd and tip='GİDER' and gider_tipi LIKE ('MTV%') order by str_to_date(gider_tarihi,'%d-%m-%Y') desc limit 0,1) mtv_tarih,
(SELECT satis_fiyat FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as satis_fiyati,
(SELECT satis_toplam FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as satis_toplam_kdvli,
(SELECT satis_kdv FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as satis_kdvsi,
(SELECT liste_toplam FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as liste_toplam,
(SELECT mtv_tutar FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as mtv_tutar,
(SELECT tescil_tutar FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as tescil_tutar,
(SELECT otv_tutar FROM satis_fiyat WHERE arac_id = stok. İd ORDER BY id desc LIMIT 0,1 ) as otv_tutar,

(SELECT COUNT(id) FROM atolye WHERE arac_id = stok. İd) isemri,
(SELECT SUM(ongorulen) FROM atolye WHERE arac_id = stok. İd) as ongorulen,
(SELECT SUM(ongorulen) FROM atolye WHERE arac_id = stok. İd and yonetici_onay = 1) as onaylanan,
(SELECT SUM(gerceklesen) FROM atolye WHERE arac_id = stok. İd) as gerceklesen
FROM stok
LEFT JOIN alim_bilgileri ON alim_bilgileri. Arac_id = stok. İd
LEFT JOIN expertiz ON expertiz. Arac_id = stok. İd
WHERE durum IN ('STOKTA','ONAY_BEKLEYEN','TEKLIF_ONAY') and alim_tipi != 'KONSINYE'

S
0 kişi takip ediyor.
Misafir olarak yayınla
19
19 CEVAP

https://codeshare.io/24Yd04?fref=gc
bu şekilde paylaşırsan daha belirleyici olur, birde ne yapmak istediğini söylersen sorguyu ona göre değerlendirebiliriz

S

Farklı farklı tablolardan veriler çekiyorum 2 dakika ya yakın sürüyor. Nasıl süreyi azaltabilirim alternatif çekim yöntemi varmıdır yaptıgım sorgulara, neden yavaş çekerin cevaplarını yöntemlerini arıyorum Serkan Çama

Serkan Gumus 6 yıl

Bu nasıl sorgu yarabbim, up

V

Bu ne sorgudur yarabbi, seni tanımak istiyorum sunucum, bana mutlaka Ping at

M

herşeyi gidip tek tek almak yerine toplu şekilde alıp case when ve union ile toparlayabilirsin.

S

ufak bir örnek verebilirmisin.

Serkan Gumus 6 yıl

çok vaktim yok bayağı uzun bir query kısa kısa yazayım devamını toparlayabilirsin belki: select *,......, SUM(case whena. Yonetici_onay = 1 THENa. Ongorulen ELSE 0 END) ongorulen_toplam from stok inner join atolye aa. X = stokid....... inner join satis_fiyatb. Y = stokid

Semih Doğangüzel 6 yıl

countları ve sumları rediste yada mysql extra bir tableda tutarsan yararına

A

bu nasil bi sorgu kiyamet gunu sorgusuna bunun yaninda hic olur

S

bu sorgu bir şey değil.. Dba eyle minimum 2000 satır sorgu yazıyor

Ali Arsln 6 yıl

serkanim epey baktim. Senin islem yukunu tamamini mysqle yikiyosun. Stackoverflow a bir danisak derim ama. Yinede browser ve apache tarafina bolustursek epey hizlanir gibi geliyo

M

mesela su sort olaylari varya bunlar fazla yuk gibi geldi. Ben sortu bile jsye yiktim

M

bu arada bu sorgu bisi degil. Benim tum hayatim boyunca veri yapisi kullanim kolayligi ve muthis basarili arayuzu olan gordugum tek browser tabanli uygulama. Serkan Gumus bu konuda kendini asmis biri

M

Mesut kardeşim sağolasın sende bu konuda hem iyisin hemde yardım sever oluşun bu topluğa çok büyük artı. Grupta tanıştığım kaliteli insanlardan birisin. Birbirimize katacağımız çok şeyler olduğuna inanıyorum. Herkesin tecrübeleri farklı yönlerde oluyor.

Serkan Gumus 6 yıl

Sorgunun en basina explain yazda sonuclari atsana bi
explain select ... Seklinde kullanimi

M

Sub querylerin hepsini view olarak yaz joinle bagla

Mustafa Tascilar 6 yıl

Egerki cokca calstriyorsan bu sorguyu memcached ile kullan Duz mantik wherede gordugun herseye index ekle Like leri duzenleyip ineger alana cekmelisin dogrudan baglamalisin

Mustafa Tascilar 6 yıl

Alim tipi durum bunlari enum yap

Mustafa Tascilar 6 yıl

Egerki update sorgundan daha fazla select sorgun varsa tablo motorunu myisama cek

Mustafa Tascilar 6 yıl

Bunlardan bazilari veya tamamini yapms olabilirsin diger yorumlari explain sonucunna gore bakalm

Mustafa Tascilar 6 yıl

Bakmaya erindim valla

A

Bir hocamız, Oracle için şöyle derdi.
Eğer bir sorgu 0,0002 saniyeden uzun sürüyorsa, sorun Oracle da değil, kodu yazan da veya veritabanı yapılandırmasındadır.

Kodunuzu incelemedim ama belki tablo yapılarınız, ilişkilerinizde de sorun olabilir.

M

Oda abartmıs.. Değişir ama max 100 msi gecmemeli butun querylerin

Ali Arsln 6 yıl

0,0002 saniye 0,2 milisaniye eder boş tabloya select sorgusu bile 1 milisaniye tutar.

Başbuğ Akinönder 6 yıl

Aynı tablolara birden fazla select sorgusu çekilmiş, raporlama amaçlı ise kasmasanızda olur, ama diğer türlü anlık kullanılacak olsa bir sürü inner join ve bir sürü fonksiyon ve prosedür yazmak gerekli

B

aynı datayı 0.0002 saniyede çeksin bende bu işi bırakırım.

S

Bu tür çok işlem yükü gerektiren databaseler için maalesef MySQL native hali ile kesinlikle uyumlu değil. Bunun nedeni çok basit sen bu statementi sunucuya her gönderişinde bu tekrar tekrar yorumlanıyor. Mysql query cache ile statementlar hafızaya kaydedilebiliyor fakat result set yani sonuçlarda kaydediliyor ve bu makineyi şişiriyor. Stored procedure leri önerenler olabilir fakat bu yine her session için tekrar yorumlandığı için queryden hiç bir farkı kalmıyor.

Çözüm ileriki aşamalarda SQL Server(MSSQL) ve ya Oracle a kayıyor. Oracle ve SQL Server Query Execution Plan konusunda baya öndeler ve Stored Procedure ler hakikatten compile edildiği için (hatta sql server da bu stored procedure dll e çevirilip baya yüksek hızlara ulaşabiliyor) MySQL den kat kat daha öndeler.

Her halükarda PHP - MySQL ikilisi çok konuşulur ama PHP - SQL Server ikilisinin çok daha hızlı olduğunu söyleyebilirim.

E

PostGreSql de durum nasıl acaba?

Mustafa Balci 6 yıl

PostgreSQL hakkında maalesef bir bilgim yok.

Erol Yrttş 6 yıl

İstatistiği tutulacak her tablo için birer stat tablosu oluşturulup, triggerlar ile otomatik yaptırılabilir belki, tabi bu şakilde değilde, örneğin her kayıt eklendiğinde count'ı 1 arttıracak, silindiğinde eksiltecek şekilde ayarlanırsa faydalı olur bence

A

Arkadaşlar memcache ile şimdilik problemi çözdüm. Ama ne kadar doğru bir iş yaptım bilmiyorum. Sql yogunlugunu geçici olarak çözmüş oldum. Mustafa Tascilar arkadaşın dediği mantıklı geldi boş bir zamanda onuda deneyeceğim. İlginiz için teşekürler.

S

ne kadar hizlandi?

Mesut Şekeroğlu 6 yıl

118 sn sorguyu yapadıgı için 6sn felan uida ugraşıyor 112 sn hızlandı

Serkan Gumus 6 yıl

Mysql stored procedure bunun gibi sorgular icin bicilmis kaftan, tam sistemi bilmiyorum ancak cronlarla gecici tablolama sistemide ikinci secenek. Kisiye gore degismiyorsa duzenli XML ciktisi yapip ordanda cekebilirsin, ama tablo yapinada bakmak lazim, onlar ne kadar iyi mesela index Vs kullandinmi

Y

arkadaşlar tekrar ben, memcache olayı pek içime sinmemişti güncel datayı görmek istediğimizde yine aynı sorgu süresini görecekti, yaptığım bir hatayı sizinle paylaşmak istiyorum ki sizde yapmayın. Ben primary keylerin normalde indexlendiğini sanıyordum ta ki bu güne kadar. Lakin işin aslı öyle değilmiş tüm tablolarda primary keyleri ve secondary keyleri index olarak atadım inanılmaz bir hız kattı 1 sn nin altına düştü 120 snlik sorgu.

S

Yanlış söylemeyeyim ama sadece primary değil uniq de yapınca index oluyordu

Başbuğ Akinönder 6 yıl

Başbuğ Akinönder uniqde yaptım valla kardeşim ama öyle değilmiş işin aslı navicate kullanıyorum primary key ve uniq yapmıştım öncesinde bilginiz olsun bu tarz bir problemle karşılaşırsanız. Hoş böyle problemler bir nevi iyi oluyor bütün cache sistemlerini denemiş oldum mysqlde php de girmedigim configrasyon kalmadı.

Serkan Gumus 6 yıl

Arkadaşlar lütfen yanlış bilgi vermeyin, primary key otomatik olarak indeksleniyor: https://dev.mysql.com/doc/refman/5.7/en/optimizing-primary-keys.html?fref=gc "The primary key for a table represents the column or set of columns that you use in your most vital queries. It has an associated index, for fast query performance." #

Hüseyin Yürükoğlu 6 yıl

Hüseyin Yürükoğlu 1 sn nin altına düştü sorgu 120 snde gelen sorgu yanlış bilgi vermiyorum mantıksal açıklamasını yaparbilirmisiniz merak ediyorum.

Serkan Gumus 6 yıl

Sorgu süresi düşebilir ona bir şey demiyorum. Benim dediğim şudur: Primary keyler otomatik olarak indexlenir. Tabloyu yaratırken belki de yaptığınızı sandığınız primary key yapılmamıştır. Elimizde gerekli veriler olmadan nasıl mantıksal açıklama yapalım ki?

Hüseyin Yürükoğlu 6 yıl