中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

隱式轉換引起sql慢查詢的示例分析

發布時間:2021-07-30 10:47:37 來源:億速云 閱讀:157 作者:小新 欄目:數據庫

小編給大家分享一下隱式轉換引起sql慢查詢的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

引言

實在很無語呀,遇到一個mysql隱式轉換問題,問了周邊的dba大拿該問題,他們居然反問我,你連這個也不知道?白白跟他們混了那么長   尼瑪,我還真不知道。罪過罪過…. 

問題是這樣的,一個字段叫task_id, 本身是varchar字符串類型,但是因為老系統時間太長了,我以為是int或者bigint,所以直接在代碼寫sql跑數據,結果等了好久就是沒有反應,感覺要壞事呀。在mysql processlist里看到了該sql語句,直接kill掉。 該字段是有索引的,并且他的sql選擇性很高,索引的價值也高。 但為什么這么慢?

分析問題

通過explain分析出了結果,當使用整型來查詢字符串的字段會出現無法走索引的情況,看下面可以知道,key為NULL,沒走索引,Rows是很大的數值,基本是全表掃描了。  當正常的用字符串查詢字符串就很正常了,索引沒問題,rows的值為1,這里說的是掃描聚簇索引的rows,而不是索引二級索引。

隱式轉換引起sql慢查詢的示例分析

那么為什么會出現這問題?

下面是mysql官方給出的說法, 最后一條很重要,當在其他情況下,兩個參數都會統一成 float 來比較。 居然新版的mysql在優化器層面已經做了一些調整規避這問題,但我自己的測試版本是mysql 5.6,阿里云用的也是5.7,都沒有解決該問題。 看來是更高版本解決吧,這個待驗證。

看完了官方解說,我們知道上面那一句慢查詢sql,其實就相當于 where to_int(taskid) = 516006380 。當然直接用to_int是顯示轉換了,但是對比出來的效果是一致的。  不管是隱式轉換,還是顯示轉換,速度能起來才怪。。。 因為mysql不支持函數索引。

# xiaorui.cc
 
If both arguments in a comparison operation are strings, they are compared as strings.
If both arguments are integers, they are compared as integers.
Hexadecimal values are treated as binary strings if not compared to a number.
If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. Note that this is not done for the arguments to IN()! To be safe, always use complete datetime, date, or time strings when doing comparisons. For example, to achieve best results when using BETWEEN with date or time values, use CAST() to explicitly convert the values to the desired data type.
If one of the arguments is a decimal value, comparison depends on the other argument. The arguments are compared as decimal values if the other argument is a decimal or integer value, or as floating-point values if the other argument is a floating-point value.
In all other cases, the arguments are compared as floating-point (real) numbers.

翻譯為中文就是:

  • 兩個參數至少有一個是 NULL 時,比較的結果也是 NULL,例外是使用 <=> 對兩個 NULL 做比較時會返回 1,這兩種情況都不需要做類型轉換

  • 兩個參數都是字符串,會按照字符串來比較,不做類型轉換

  • 兩個參數都是整數,按照整數來比較,不做類型轉換

  • 十六進制的值和非數字做比較時,會被當做二進制串

  • 有一個參數是 TIMESTAMP 或 DATETIME,并且另外一個參數是常量,常量會被轉換為 timestamp

  • 有一個參數是 decimal 類型,如果另外一個參數是 decimal 或者整數,會將整數轉換為 decimal 后進行比較,如果另外一個參數是浮點數,則會把 decimal 轉換為浮點數進行比較

  • 所有其他情況下,兩個參數都會被轉換為浮點數再進行比較

看完了這篇文章,相信你對“隱式轉換引起sql慢查詢的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

sql
AI

安宁市| 洛南县| 缙云县| 咸宁市| 泰安市| 宁晋县| 岑溪市| 武平县| 清涧县| 庆云县| 稻城县| 温宿县| 涟水县| 西林县| 丹巴县| 赤城县| 瓦房店市| 咸丰县| 太康县| 长武县| 彩票| 咸阳市| 衡东县| 咸宁市| 营口市| 达拉特旗| 河曲县| 华池县| 洛川县| 始兴县| 广灵县| 灵山县| 昌黎县| 南江县| 漾濞| 孝感市| 大埔区| 玉环县| 丹寨县| 新乐市| 驻马店市|