Php 理解参数化查询中i和s之间的含义
我刚刚弄明白了为什么从PHP前端运行的查询比从MySQL监视器运行查询要花费大约50秒的时间,但我想更好地理解其中的含义。我现在使用两个变量,$extension和$today,并通过参数化将它们发送到mysql。当我选择将$extension作为整数引用时,需要很长时间。当我把它称为字符串时,它是非常瞬时的 查询Php 理解参数化查询中i和s之间的含义,php,mysql,Php,Mysql,我刚刚弄明白了为什么从PHP前端运行的查询比从MySQL监视器运行查询要花费大约50秒的时间,但我想更好地理解其中的含义。我现在使用两个变量,$extension和$today,并通过参数化将它们发送到mysql。当我选择将$extension作为整数引用时,需要很长时间。当我把它称为字符串时,它是非常瞬时的 查询 $stmt = $db_conn->prepare( "select from_unixtime(dateTimeOrigination) as date_of_call_or
$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)
它们似乎是电话号码,应该始终是字符串,以保留前导零,并避免要求数字类型具有足够的小数位数;如果列是字符串,则在where子句中使用字符串,如果它们是不同的类型,则需要进行类型转换,这将较慢,可能会影响索引的使用。嗨,Alex-因此,如果列类型是varchar,我应该将其声明为“I”?使用“s”表示stringHi,Alex-抱歉,我是指s。谢谢你,谢谢你的帮助。嗨,草莓。你是第二个提到这件事的人,我马上就去试试。非常感谢。