了解参数化查询中我和s之间的含义
问题描述:
我刚刚弄清楚为什么从我的PHP前端运行的查询比从MySQL监视器运行它的时间要长大约50秒,但想要更好地理解这些影响。我使用两个变量,$扩展和$今天并通过参数化将它们发送到mysql。当我选择$扩展作为整数时,它需要很长时间。当我把它称为一个字符串时,它非常即时。了解参数化查询中我和s之间的含义
查询;
$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 - $扩展在技术上是一个字符串,但它总是由数字组成。将它称为整数不是更好吗?它可以是5到15个字符之间的任何长度。
2 - 通过引用它作为一个字符串,它是否有可能让自己面临任何安全问题?
答
我很惊讶它有很大的不同。虽然你的测试似乎否定了这种观点,我认为,在查询的缓慢的部分是该位:
FROM_UNIXTIME(dateTimeOrigination) BETWEEN ? and ADDDATE(?, INTERVAL 1 DAY)
我会改变,要
datetimeorigination BETWEEN UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(? + INTERVAL 1 DAY)
+0
嗨,草莓。你是第二个提到这个的人,一会儿就会试一试。谢谢。 – Kimomaru
他们看来是电话号码应该始终为了保持前导零并避免需要一个足够大的数字类型的字符串。 –
你应该匹配类型;如果该列是一个字符串,则在where子句中使用一个字符串,如果它们是不同的类型需要进行类型转换,则这将会变慢可能会影响索引的使用。 –
嗨,亚历克斯 - 所以,如果列类型是varchar,我应该声明它为'我'? – Kimomaru