我刚才弄清楚为什么从我的PHP前端运行的查询比从MySQL监视器运行它的时间长约50秒,但是想要更好地理解其含义。我正在使用两个变量, $ extension 和 $ today ,并通过参数化将它们发送到mysql。当我选择将 $ extension 称为整数时,需要很长时间。当我把它称为字符串时,它是非常瞬间的。
查询;
$stmt = $db_conn->prepare(
"select from_unixtime(dateTimeOrigination) as date_of_call_origination ,
callingPartyNumber as calling_party_number,
originalcalledpartynumber as original_called_party_number,
finalCalledPartyNumber as final_called_party_number,
SEC_TO_TIME(duration) as duration,
origDeviceName, destDeviceName
from cdr_records
where (callingPartyNumber= ? or originalcalledpartynumber= ? or finalcalledpartynumber = ?)
and
from_unixtime(dateTimeOrigination) between ? and ADDDATE(?, INTERVAL 1 DAY) order by datetimeorigination desc");
我的绑定声明;
原始
$stmt->bind_param('iiiss', $extension, $extension, $extension, $today, $today);
已更改为
$stmt->bind_param('sssss', $extension, $extension, $extension, $today, $today);
所以,我有两个问题;
1 - $ extension 在技术上是一个字符串,但它总是由数字组成。称它为整数不是更好吗?它可以是5到15个字符之间的任何长度。
2 - 通过将其称为字符串,是否可能会出现任何安全问题?
答案 0 :(得分:1)
我很惊讶它有很大的不同。虽然你的测试似乎与这个观点相矛盾,但我认为查询的缓慢部分就是这样:
FROM_UNIXTIME(dateTimeOrigination) BETWEEN ? and ADDDATE(?, INTERVAL 1 DAY)
我会改为
datetimeorigination BETWEEN UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(? + INTERVAL 1 DAY)