php - MySql 查询在 PhpMyAdmin 中耗时 0.16 秒,但在 Php 中耗时 10 分钟

标签 php mysql pdo phpmyadmin query-performance

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 秒,但在带有 PDO 的 php 中需要 10 分钟。当我删除这部分时

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

在 php 中需要 1 秒

为什么会这样?你能帮我吗,谢谢。

编辑: 你只能关注这个查询,

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 秒,但在带有 PDO 的 php 中需要 10 分钟。

最佳答案

是什么导致了 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

这样更快,因为它只需要生成一次子查询表。

您在这里需要的诀窍是生成您需要的摘要作为子查询,并将其用作虚拟表。

关于php - MySql 查询在 PhpMyAdmin 中耗时 0.16 秒,但在 Php 中耗时 10 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47485432/

相关文章:

mysql - 如何在 SQL 中找到两列之间所有相反的组合

php - PHP 文档不一致?

PHP MySQL 插入/更新查询返回 true 但有错误

php - 查询结果中没有显示数据

带有两个 IN 语句的大表上的 MySQL 查询性能悬崖

PHP , PDO , 外键

mysql - Symfony2 : PdoSessionHandler Error 'sess_lifetime'

php - 找到 5 个最流行的 mysql 值

php - 将权限存储到多维数组php中

mysql - 将 CSV 文件导入 MySQL 而不使用 load data infile