Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Sorgu hızlandırma
#1
Merhaba,

Aşağıdaki sorgu 27sn sürüyor. veritabanında 500Mb civarında bir veri var. Bunu hızlandırmanın bir yolu var mı?

Everyone grubu ile ilgil ekleme ve çıkarma işlemleri anlık yansıtıldığı için like kullanıldı.



select (count(l.id) - (select count(lo.id) as toplam from folder_permission_fetch_logs as lo inner join users as us on (lo.user_id = us.id) where us.username LIKE "%Everyone" and lo.action = "USER_REMOVE")) as toplam from folder_permission_fetch_logs as l inner join users as u on (l.user_id = u.id) where u.username LIKE "%Everyone" and (l.action = "PERMISSION_ADD" or l.action = "USER_ADD");
Cevapla
#2
sorguyu sql manager lite 'ta yapıp performans ekranını paylaşabilir misin ? l.action = / us.username hep indeksli olması gerekir
Topluluk mopluluk yok :/
Cevapla
#3
1. Sorgu ilk çalıştığındaki durum. QL1.sql: Query opened in 29.959s [29.954s exec, 0.005s fetch]
2. Sorgu bir güncelleme olmadan ikinci kez çalıştrılıyor. SQL1.sql: Query opened in 0.001s [< 0,001s exec, 0.001s fetch]
Cevapla
#4
ilk sorguyu belleğe aldığı için ikinci çağırmada direk hafızadan gönderiyordur. 30sn. baz al. Sorguladığın alanlar indeksli mi ?
Topluluk mopluluk yok :/
Cevapla
#5
Merhaba,

Arkadaşların söylediği gibi kriter olarak kullanılan ve bağlantı yapılan alanlarda index olması önemli. Bir de iç içe sorgular genelde yavaş olur.
Dış sorguda count alıyor olsanız da veri tabanlarının çoğu bu iç sorguyu her satırda sorgulamaya çalışır. İçerde (select ile from arasında) kullanmanızı gerektirecek bir durum yok bu sorguda. (Bu sorguya üst sorgudan bir alanı parametre olarak göndermeniz gerekmiyor.)

select count(lo.id) as toplam from folder_permission_fetch_logs as lo inner join users as us on (lo.user_id = us.id) 
where us.username LIKE "%Everyone" 
and lo.action = "USER_REMOVE"

Şu şekilde deneye bilir misiniz ? (Tabi indeksleri kontrol ettikten sonra)

select (count(l.id) - coalesce(x.toplam,0) ) as toplam 
from folder_permission_fetch_logs as l inner join users as u on (l.user_id = u.id), 

(
select count(lo.id) as toplam from folder_permission_fetch_logs as lo inner join users as us on (lo.user_id = us.id) 
where us.username LIKE "%Everyone" 
and lo.action = "USER_REMOVE"
) as x

where u.username LIKE "%Everyone" 
and (l.action = "PERMISSION_ADD" or l.action = "USER_ADD"); 


İyi çalışmalar.
Cevapla
#6
bu şekilde çok hızlandı.

SELECT u.id FROM users u WHERE u.username LIKE '%Everyone'

SELECT SUM(IF(L.action IN ('PERMISSION_ADD','USER_ADD'),1,IF(L.action='USER_REMOVE',-1,0))) AS toplam FROM folder_permission_fetch_logs L LEFT JOIN users U ON U.id=L.user_id WHERE U.id IN (167,6,162);

Mahmut Hocam sizin sorgu 1 dakikayı geçti.

(07-07-2020, Saat: 23:10)boreas Adlı Kullanıcıdan Alıntı: ilk sorguyu belleğe aldığı için ikinci çağırmada direk hafızadan gönderiyordur. 30sn. baz al. Sorguladığın alanlar indeksli mi ?



evet indexli
Cevapla
#7
Alt sorguları her ne olursa olsun select..from arasında kullanmamak gerekmektedir. Bir şekilde istediğiniz bu değeri (gerekirse alt sorgu ile) join ile sorguya iliştirilmesi gerekiyor. Belki bir kaç satır kayıtta problem çıkmayabilir ama o satırlar çoğaldıkça sorgu her kayıt satırı için tekrar çağrıldığı için yavaşlayacaktır. Sorgunuzu etraflıca incelemedim ama bir grup kayıt sayısının diğer gruptan farkı hesaplanıyor. O yüzden direkt bu iki grubu ayrı ayrı hesaplayıp, farkını almak gerekiyor gibi geldi bana. Böylelikle her satır için alt sorgu çalışmayacaktır.
select
(
 select
   (count(l.id)) as toplam
 from folder_permission_fetch_logs as l
 inner join users as u on (l.user_id = u.id)
 where u.username LIKE "%Everyone" and (l.action = "PERMISSION_ADD" or l.action = "USER_ADD")
)
-
(
 select
   count(lo.id) as toplam from folder_permission_fetch_logs as lo
 inner join users as us on (lo.user_id = us.id)
 where us.username LIKE "%Everyone" and lo.action = "USER_REMOVE"
) as Sonuc
Tabi bu böyle midir bilemiyorum, etraflıca incelemedim ama bu sorgu da en baştaki ile aynı işi yapar gibi geldi bana.
Cevapla
#8
Bu sorgu hızlı çalıştı. Teşekkürler.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  MySQL de Aynı tabloda ki 2 farklı alanı kıyaslayan sorgu vkamadan 4 1.141 23-10-2019, Saat: 18:23
Son Yorum: vkamadan



Konuyu Okuyanlar: 1 Ziyaretçi