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

Posted

技术标签:

【中文标题】MySql 查询在 PhpMyAdmin 中耗时 0.16 秒,但在 Php 中耗时 10 分钟【英文标题】:MySql query tooks 0.16 seconds in PhpMyAdmin, but 10 minutes in Php 【发布时间】:2018-05-09 04:28:31 【问题描述】:
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 分钟。

【问题讨论】:

【参考方案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

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

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

【讨论】:

(re: 查询缓存) 不,如果使用 QC,你会得到 1ms 的时间,而不是 600ms。

以上是关于MySql 查询在 PhpMyAdmin 中耗时 0.16 秒,但在 Php 中耗时 10 分钟的主要内容,如果未能解决你的问题,请参考以下文章

在 phpmyadmin SELECT WHERE 1 中显示第 0 - 0 行(共 1 行,查询耗时 0.0008 秒。)

为什么phpMyAdmin需要很长时间来显示查询,但是显示查询执行得很快? [关闭]

SQL 查询耗时过长

MySql 查询在 PHPmyadmin 中工作,但在 codeigniter 中不工作

MySQL 查询在 phpMyAdmin 中返回的 node-mysql 中缺少结果

mysql“日期之间”查询在 phpmyadmin 中有效,但 PDO 不返回任何内容