Запрос 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 ответ:
Чем объясняется высокая производительность в 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
Это быстрее, потому что ему нужно только один раз сгенерировать таблицу подзапросов.
Умение, которое вам нужно здесь, заключается в создании резюме, которое вам нужно в качестве подзапроса, и использовании его в качестве виртуальной таблицы.