2017-02-03 58 views
0

我剛剛弄清楚爲什麼從我的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 - 通過引用它作爲一個字符串,它是否有可能讓自己面臨任何安全問題?

+2

他們看來是電話號碼應該始終爲了保持前導零並避免需要一個足夠大的數字類型的字符串。 –

+2

你應該匹配類型;如果該列是一個字符串,則在where子句中使用一個字符串,如果它們是不同的類型需要進行類型轉換,則這將會變慢可能會影響索引的使用。 –

+0

嗨,亞歷克斯 - 所以,如果列類型是varchar,我應該聲明它爲'我'? – Kimomaru

回答

1

我很驚訝它有很大的不同。雖然你的測試似乎否定了這種觀點,我認爲,在查詢的緩慢的部分是該位:

FROM_UNIXTIME(dateTimeOrigination) BETWEEN ? and ADDDATE(?, INTERVAL 1 DAY) 

我會改變,要

datetimeorigination BETWEEN UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(? + INTERVAL 1 DAY) 
+0

嗨,草莓。你是第二個提到這個的人,一會兒就會試一試。謝謝。 – Kimomaru