php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行

使用EXPLAIN查看查询的执行计划.确保MySQL有合适的可用索引,并且正在使用这些索引.

查询文本似乎缺少此处的列名…

t.usr_code = u. ORDER

^^^

我们可以“猜测”应该是u.usr_code的代码,但这只是一个猜测.

应该返回多少行?结果集有多大?

您的客户端是否要尝试将所有行“存储”在内存中,并因为内存不足而崩溃?

如果是这样,我建议您避免这样做,并在需要时获取行.

或者,考虑在WHERE子句中添加一些其他谓词,以仅返回所需的行,而不返回表中的所有行.

现在是2015年.该放弃老式的逗号语法进行联接操作了,改为使用JOIN关键字,并将联接谓词从WHERE子句移到ON子句.并格式化它.数据库不在乎,但是它将使需要解密您的SQL语句的可怜的灵魂变得更容易.

SELECT a.accnt_name

, u.username

, DATE_FORMAT(t.in_time ,'%H:%i') AS inTime

, DATE_FORMAT(t.out_time ,'%H:%i') AS outTime

, DATE_FORMAT(t.work_time,'%H:%i') AS workTime

, w.wrktyp_name

, t.remarks

, DATE_FORMAT(t.tmsht_date, '%d-%b-%Y') AS tmshtDate

, wl.loctn_name

, s.serv_name

, t.status_code

, t.conv_kms AS convkms

, t.conv_amount AS convamount

FROM timesheets t

JOIN accounts a

ON a.accnt_code = t.accnt_code

JOIN services s

ON s.serv_code = t.serv_code

JOIN worktypes w

ON w.wrktyp_code = t.wrktyp_code

JOIN work_location wl

ON wl.loctn_code = t.loctn_code

JOIN users

ON u.usr_code = t.usr_code

ORDER BY t.tmsht_date DESC

在格式化日期列上的排序非常奇怪.您更有可能希望结果以“日期”顺序返回,而不是以年份前的月份和日期的字符串顺序返回. (您真的要在年份之前先按日值排序吗?)

跟进

如果这个完全相同的查询很快完成,并且整个结果集(大约720行)来自另一个客户端(同一数据库,同一用户),则该问题很可能不是此SQL语句.

我们不希望执行SQL语句导致PHP“崩溃”.

如果要存储整个结果集(例如,使用mysqli store_result),则需要具有足够的内存.但是选择列表中的13个表达式看起来都比较短(格式化的日期,名称和代码),并且我们不希望“备注”超过2 KB.

正如其他人所建议的那样,要调试此功能,请尝试在查询中添加LIMIT子句,例如LIMIT 1并观察其行为.

或者,使用虚拟查询进行测试;使用保证返回特定值和特定行数的查询.

SELECT 'morpheus' AS accnt_name

, 'trinity' AS username

, '01:23' AS inTime

, '04:56' AS outTime

, '00:45' AS workTime

, 'neo' AS wrktyp_name

, 'yada yada yada' AS remarks

, '27-May-2015' AS tmshtDate

, 'zion' AS loctn_name

, 'nebuchadnezzar' AS serv_name

, '' AS status_code

, '123' AS convkms

, '5678' AS convamount

我怀疑查询不是您观察到的行为的根本原因.我怀疑问题出在代码的其他地方.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值