資料庫索引,可以讓查詢sql語句效率更高。所以大家在寫查詢的sql語句時為了讓語句執行效率高會讓語句能命中索引,或者新建合適的索引。
可是,有時候大家會遇到像下面說的這樣的情況。
明明我sql語句where條件的欄位是符合索引,應該可以命中索引的,但是執行時卻沒有命中索引。
為什麼會這樣呢,是人性的……
額,串臺了,調回來。
要說明這個問題,大家先來比較一下下面的這兩個sql語句。
這兩個sql語句唯一的區別就是where條件中id對應的值一個加了引號,一個沒有加引號。
這樣會有什麼影響嗎?
有的朋友可能要說了,這樣的sql,我試過,一樣都能查出來正確的結果啊。
如果數據量很小時,是也許沒多大影響。
但是當數據量大的時候,就會出現上面所說的問題了,其中一個sql會因為無法命中索引,而執行非常慢。
因為如果等號左邊的欄位的數據類型和等號右邊的數據類型不一致時,就會發生隱式轉換,如此就相當於是執行函數後再進行比較,這樣就會索引失效了。
那要怎麼避免這樣的問題發生呢?
其實簡單,舉例說一下,就是如果等號左邊的欄位的數據類型是數字類型的,那等號右邊對應的值就要寫成數值類型,不要加引號變成字符串類型。如果等號左邊的欄位是字符串類型的,那等號右邊的值就一定要加引號,不要寫成數字類型。
到這裡,可能有的朋友犯難了,可是我代碼中等號右邊的值不是我寫的呀,是ORM框架賦值的(比如mybatis)。這樣的話,我要怎麼保證等號左右的數據類型一致呢?
其實ORM框架做對應賦值時,是更加對應參數的數據類型來處理的。比如mybatis,是根據對應參數在Java中的數據類型來處理賦值的。如果在Java中的數據類型是數值類型的,那賦值拼接sql時,就不會加引號,如果在Java中的數據類型是字符串類型的,那賦值拼接sql時,就會加上引號了。
現在是不是明白了。今天的內容就到這裡了。
歡迎朋友們長按點讚的小手按鈕,來個三連支持我啊。