close

在 MySQL 中,要查詢某張資料量約數十萬筆的 table,不知道為什麼會非常慢才回應,下了 select 後,看似單純的查詢卻要十幾秒才回應,加上最終結果是將三段 select 以 unioin 結合起來,整個 SQL 執行完畢時,常常已經過了 MySQL Workbench 預設的 30 秒逾時時間。

而且很奇怪的是,在 PHP 程式裡,這段 SQL 就會回應得很迅速。

後來同事幫我除錯一下,發現問題是個簡單的小細節,假設我執行很慢的語法是這樣:

select * from product where product_id = 123;

改成這樣就好了,差別就只是條件有沒有包上單引號 (single quote, ''):

select * from product where product_id = '123';

因為我們的 product_id 的欄位型態是個 varbinary(有時可能會文數字混合),如果在 where 條件裡讓它為數值型態,就會一直被 MySQL 自動轉型,量少的時候沒什麼感覺,量一多就明顯慢下來。

那為什麼在 PHP 程式裡會回應得很快呢?我看了一下,是因為我們利用 PDO 做參數化查詢時,有正確地指定型態為 PDO::PARAM_STR

超慘的低級錯誤,記錄下來引以為誡啊。

 

arrow
arrow
    文章標籤
    mysql query select slow query
    全站熱搜

    小攻城師 發表在 痞客邦 留言(0) 人氣()