Запрос MySql занимает 0,16 секунды в PhpMyAdmin, но 10 минут в Php


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 это занимает 0,6 секунды, но в php с PDO это занимает 10 минут. И когда я удаляю эту часть

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

Это занимает 1 секунду в php

А почему бы и нет? вы можете мне помочь, Спасибо.

Править : вы можете только сфокусировать этот запрос,

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

В PhpMyAdmin это занимает 0,6 секунды, но в php с PDO это занимает 10 минут.

1 3

1 ответ:

Чем объясняется высокая производительность в 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

Это быстрее, потому что ему нужно только один раз сгенерировать таблицу подзапросов.

Умение, которое вам нужно здесь, заключается в создании резюме, которое вам нужно в качестве подзапроса, и использовании его в качестве виртуальной таблицы.