php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行
我正在開發(fā)時(shí)間表應(yīng)用程序,并編寫PHP代碼以提取所有時(shí)間表直到日期.這是我為獲取時(shí)間表而編寫的查詢-
選擇a.accnt_name,u.username,DATE_FORMAT(t.in_time,’%H:%i’)inTime,DATE_FORMAT(t.out_time,’%H:%i’)outTime,DATE_FORMAT(t.work_time,’%H :%i’)工作時(shí)間,w.wrktyp_name,t.remarks,DATE_FORMAT(t.tmsht_date,’%d-%b-%Y’)tmshtDate,wl.loctn_name,s.serv_name,t.status_code,t.conv_kms convkms ,t.conv_amount從時(shí)間表t,帳戶a,服務(wù)s,工作類型w,工作位置wl,用戶WHERE a.accnt_code = t.accnt_code和w.wrktyp_code = t.wrktyp_code和wl.loctn_code = t.loctn_code和s.serv_code = t.serv_code和t.usr_code = u.按tmsht_date desc排序
where子句包含從各個(gè)表中獲取各個(gè)代碼的實(shí)際值的子句.
問(wèn)題在于此查詢需要花費(fèi)大量時(shí)間來(lái)執(zhí)行,并且應(yīng)用程序在幾分鐘后崩潰.
我在phpmyadmin中運(yùn)行了此查詢,在這里它沒(méi)有任何問(wèn)題.
需要幫助來(lái)了解執(zhí)行速度緩慢背后的原因.
解決方法:
使用EXPLAIN查看查詢的執(zhí)行計(jì)劃.確保MySQL有合適的可用索引,并且正在使用這些索引.
查詢文本似乎缺少此處的列名…
t.usr_code = u. ORDER
^^^
我們可以“猜測(cè)”應(yīng)該是u.usr_code的代碼,但這只是一個(gè)猜測(cè).
應(yīng)該返回多少行?結(jié)果集有多大?
您的客戶端是否要嘗試將所有行“存儲(chǔ)”在內(nèi)存中,并因?yàn)閮?nèi)存不足而崩潰?
如果是這樣,我建議您避免這樣做,并在需要時(shí)獲取行.
或者,考慮在WHERE子句中添加一些其他謂詞,以僅返回所需的行,而不返回表中的所有行.
現(xiàn)在是2015年.該放棄老式的逗號(hào)語(yǔ)法進(jìn)行聯(lián)接操作了,改為使用JOIN關(guān)鍵字,并將聯(lián)接謂詞從WHERE子句移到ON子句.并格式化它.數(shù)據(jù)庫(kù)不在乎,但是它將使需要解密您的SQL語(yǔ)句的可憐的靈魂變得更容易.
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
在格式化日期列上的排序非常奇怪.您更有可能希望結(jié)果以“日期”順序返回,而不是以年份前的月份和日期的字符串順序返回. (您真的要在年份之前先按日值排序嗎?)
跟進(jìn)
如果這個(gè)完全相同的查詢很快完成,并且整個(gè)結(jié)果集(大約720行)來(lái)自另一個(gè)客戶端(同一數(shù)據(jù)庫(kù),同一用戶),則該問(wèn)題很可能不是此SQL語(yǔ)句.
我們不希望執(zhí)行SQL語(yǔ)句導(dǎo)致PHP“崩潰”.
如果要存儲(chǔ)整個(gè)結(jié)果集(例如,使用mysqli store_result),則需要具有足夠的內(nèi)存.但是選擇列表中的13個(gè)表達(dá)式看起來(lái)都比較短(格式化的日期,名稱和代碼),并且我們不希望“備注”超過(guò)2 KB.
正如其他人所建議的那樣,要調(diào)試此功能,請(qǐng)嘗試在查詢中添加LIMIT子句,例如LIMIT 1并觀察其行為.
或者,使用虛擬查詢進(jìn)行測(cè)試;使用保證返回特定值和特定行數(shù)的查詢.
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
我懷疑查詢不是您觀察到的行為的根本原因.我懷疑問(wèn)題出在代碼的其他地方.
https://www.icode9.com/content-2-529101.html
總結(jié)
以上是生活随笔為你收集整理的php mysql 查询时间_PHP-MySQL查询需要大量时间才能执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 比人都高!博主打造世界最大Xbox主机:
- 下一篇: 我国万亿GDP城市将再扩容,排在前三的城