2017-11-25 389 views
3
SELECT 
r.id randevu_id, 
r.id,m.ad,m.soyad,r.musteri_id,m.telefon, 
r.tarih,r.hizmet_id, 
IFNULL((SELECT MAX(o.tarih) 
FROM odemeler o WHERE o.sil=0 AND o.randevu_id=r.id),"0000-00-00") sonodemetarih, 
r.tutar borc 
FROM randevular r 
LEFT JOIN musteriler m ON m.id = r.musteri_id 
WHERE r.sil = 0 AND r.randevu_durumu != 2 

在phpMyAdmin爲10分鐘tooks0.6秒但與PDO PHP它tooks 10分鐘。當我刪除該部分MySQL查詢tooks在phpMyAdmin0.16秒,但是在PHP

IFNULL((SELECT MAX(o.tarih) 
FROM odemeler o WHERE o.sil=0 AND o.randevu_id=r.id),"0000-00-00") sonodemetarih 

它tooks在PHP

1秒它爲什麼會這樣?你能幫助我嗎,謝謝。

編輯: 你只能在phpMyAdmin關注此查詢,

SELECT 
(SELECT count(1) FROM payments p WHERE p.appointment_id=ap.id AND p.sil=0) 
as paymentscount 
FROM appointments ap 

它tooks0.6秒但與PDO PHP它tooks 10分鐘。

回答

2

什麼說明myAdmin中的高性能?可能是查詢緩存。當測試查詢性能時使用SELECT SQL_NO_CACHE ...或MySQL將記住以前的查詢結果並再次提供給您。

究竟是什麼原因導致查詢性能下降?它有一個依賴的子查詢,MySQL可能會爲主查詢的每一行重複該子查詢。

嘗試重構查詢以避免依賴子查詢,而是加入獨立的摘要子查詢。

你的查詢是這樣的:

   SELECT COUNT(*) payment_count, appointment_id 
       FROM payments 
       WHERE sil=0 
       GROUP BY appointment_id 

它通過預約給支付計數的小桌子。

加入,爲您的查詢的其餘部分:

SELECT ap.*, pc.payment_count 
    FROM appointments ap 
    LEFT JOIN (
      SELECT COUNT(*) payment_count, appointment_id 
       FROM payments 
       WHERE sil=0 
       GROUP BY appointment_id 
     ) pc ON ap.id = pc.appointment_id 

這是更快,因爲它只有一次產生的子查詢表。

您需要的訣竅是生成您需要的摘要作爲子查詢,並將其用作虛擬表。

+0

非常感謝你,你一直很有幫助:) – agopoga

+0

(re:查詢緩存)不,如果使用QC,你會得到一個像1ms,從不600ms的時間。 –