前段時間發現後臺某個查詢常常超時,後來經過排查,把SQL語句打印出來,結果發現:mysql
原來是開發人員在查詢日期時,在參數裏不當心增長了一個單引號,好了,到此問題出現了,原來是粗枝大葉的錯誤。可是,當我再深究下去,既然字段類型是日期,但參數是字符串,爲什麼mysql沒有報錯呢?sql
後來我將語句複製到Mysql的查詢器裏測試,發現這個SQL語句能夠正常查出結果(改成其它日期能夠查出相應的結果),mysql並無報錯,可是查詢時間十分長,平均須要40多秒,這就是後臺報time-out的緣由吧。數據庫
因爲這個表數據量,咱們以前作了索引,所以我猜這個語句是沒有使用索引的。而後我把錯誤的單引號去掉從新查,發現結果幾乎是秒出,而後我猜測,是那個單引號致使參數類型變爲字符串,不符合索引字段類型,從而沒有使用索引。oracle
因而在查詢器使用「explain」分析語句,結果顯示雖然使用了索引,可是檢索範圍並無獲得有效的減小,幾乎是全表檢索;而正確的語句經過索引縮小到只有9W多行,所以結果都是秒出的了。測試
作成這個問題的根本緣由是mySql5.5和5.1版本在類型轉換時有問題。索引
下面看一個實例:開發
假設我須要修改name = 23的名字,在查詢器裏輸入SQL語句:SELECT * FROM test_1 WHERE NAME = 23 ,而後得出的結果是:字符串
若是此時更新語句:UPDATE test_1 SET NAME = 24 WHERE NAME = 23;,我能夠很負責任地說會進行全表更新。test
作出這個緣由是,當所使用的條件的字段值類型和數據庫的定義的字段類型不同時,MySQL就會在內部作數據轉化,將數據庫中的記錄轉化爲整數作比較,將空值轉化爲整數0作比較。在字符串轉化過程當中,遇到特殊符號是會捨去特殊符號和後面的值,因此就會出現上述狀況了。後臺
這個問題告誡咱們,在where 的條件中,字段類型與給定值類型必須對應。對應是有好處的,可以促使條件走上索引,固然也不會踩上諸如上面的地雷,萬一不當心,就把全表給更新了,PS:聽說oracle 是相反操做的,即把條件類型轉換爲數據表類型,從而不會出現上述問題,爲何不轉換條件中的一個字段類型,而轉換表中過千萬的字段類型,mysql這個作法的確使人沒法理解。