欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

隱式轉(zhuǎn)換引起的sql慢查詢實(shí)戰(zhàn)記錄

 更新時(shí)間:2018年04月13日 10:54:54   作者:峰云就她了  
大家知道數(shù)據(jù)庫為了提高查詢速度,增加索引是必不可少的,但是有些時(shí)候即使你加了索引也不定有效果,這篇文章主要給大家介紹了一次因?yàn)殡[式轉(zhuǎn)換引起的sql慢查詢的相關(guān)資料,需要的朋友可以參考下。

引言

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

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

分析問題

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

那么為什么會(huì)出現(xiàn)這問題?

下面是mysql官方給出的說法, 最后一條很重要,當(dāng)在其他情況下,兩個(gè)參數(shù)都會(huì)統(tǒng)一成 float 來比較。 居然新版的mysql在優(yōu)化器層面已經(jīng)做了一些調(diào)整規(guī)避這問題,但我自己的測試版本是mysql 5.6,阿里云用的也是5.7,都沒有解決該問題。 看來是更高版本解決吧,這個(gè)待驗(yàn)證。

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

# 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.

翻譯為中文就是:

  • 兩個(gè)參數(shù)至少有一個(gè)是 NULL 時(shí),比較的結(jié)果也是 NULL,例外是使用 <=> 對兩個(gè) NULL 做比較時(shí)會(huì)返回 1,這兩種情況都不需要做類型轉(zhuǎn)換
  • 兩個(gè)參數(shù)都是字符串,會(huì)按照字符串來比較,不做類型轉(zhuǎn)換
  • 兩個(gè)參數(shù)都是整數(shù),按照整數(shù)來比較,不做類型轉(zhuǎn)換
  • 十六進(jìn)制的值和非數(shù)字做比較時(shí),會(huì)被當(dāng)做二進(jìn)制串
  • 有一個(gè)參數(shù)是 TIMESTAMP 或 DATETIME,并且另外一個(gè)參數(shù)是常量,常量會(huì)被轉(zhuǎn)換為 timestamp
  • 有一個(gè)參數(shù)是 decimal 類型,如果另外一個(gè)參數(shù)是 decimal 或者整數(shù),會(huì)將整數(shù)轉(zhuǎn)換為 decimal 后進(jìn)行比較,如果另外一個(gè)參數(shù)是浮點(diǎn)數(shù),則會(huì)把 decimal 轉(zhuǎn)換為浮點(diǎn)數(shù)進(jìn)行比較
  • 所有其他情況下,兩個(gè)參數(shù)都會(huì)被轉(zhuǎn)換為浮點(diǎn)數(shù)再進(jìn)行比較

總結(jié)

sql查詢的時(shí)候,字段的類型要保持一致,不然會(huì)數(shù)據(jù)字段的隱式轉(zhuǎn)換,繼而出現(xiàn)慢查詢。 還是那句廢話,多看mysql的慢查詢?nèi)罩?,有你想要?

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 數(shù)據(jù)庫測試 實(shí)用技巧及測試方法

    數(shù)據(jù)庫測試 實(shí)用技巧及測試方法

    軟件應(yīng)用程序已經(jīng)離不開數(shù)據(jù)庫。無論是在Web、桌面應(yīng)用、客戶端服務(wù)器、企業(yè)和個(gè)人業(yè)務(wù),都需要數(shù)據(jù)庫在后端操作。
    2011-07-07
  • IndexedDB瀏覽器內(nèi)建數(shù)據(jù)庫并行更新問題詳解

    IndexedDB瀏覽器內(nèi)建數(shù)據(jù)庫并行更新問題詳解

    這篇文章主要為大家介紹了IndexedDB瀏覽器內(nèi)建數(shù)據(jù)庫并行更新問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • dbeaver導(dǎo)入導(dǎo)出數(shù)據(jù)庫簡單圖文教程

    dbeaver導(dǎo)入導(dǎo)出數(shù)據(jù)庫簡單圖文教程

    DBeaver是一款適用于開發(fā)人員、數(shù)據(jù)庫管理員和分析師的多平臺(tái)、多數(shù)據(jù)庫管理工具,這篇文章主要給大家介紹了關(guān)于dbeaver導(dǎo)入導(dǎo)出數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 很全的SQL中文解釋代碼

    很全的SQL中文解釋代碼

    學(xué)習(xí)sql的朋友可以參考下,中文版sql命令
    2008-04-04
  • 有效防止SQL注入的5種方法總結(jié)

    有效防止SQL注入的5種方法總結(jié)

    SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,它不是利用操作系統(tǒng)的BUG來實(shí)現(xiàn)攻擊,而是針對程序員編程時(shí)的疏忽,通過SQL語句,實(shí)現(xiàn)無帳號(hào)登錄,甚至篡改數(shù)據(jù)庫。下面這篇文章主要給大家介紹了關(guān)于防止SQL注入的5種方法,教大家有效的防止sql注入,需要的朋友可以參考學(xué)習(xí)。
    2017-03-03
  • 錯(cuò)誤代碼:1100 Table ''t_depart_info'' was not locked with LOCK TABLES的解決方法

    錯(cuò)誤代碼:1100 Table ''t_depart_info'' was not locked with LOCK T

    這篇文章就是告訴大家如何解決錯(cuò)誤代碼:1100 Table 't_depart_info' was not locked with LOCK TABLES,遇到類似問題的朋友可以參考一下
    2015-10-10
  • neo4j圖數(shù)據(jù)庫安裝實(shí)踐與報(bào)錯(cuò)問題的解決

    neo4j圖數(shù)據(jù)庫安裝實(shí)踐與報(bào)錯(cuò)問題的解決

    這篇文章主要介紹了neo4j圖數(shù)據(jù)庫安裝實(shí)踐與報(bào)錯(cuò)問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • sql注入之新手入門示例詳解

    sql注入之新手入門示例詳解

    這篇文章僅僅是對SQL注入進(jìn)行了一個(gè)簡單的入門知識(shí)的講解,是sql注入的基礎(chǔ)篇,有個(gè)好的開頭能夠幫助大家對SQL注入有一個(gè)具體清晰的了解和認(rèn)識(shí)。下面來一起看看吧,有需要的可以參考借鑒。
    2016-09-09
  • Instagram提升PostgreSQL性能的五個(gè)技巧

    Instagram提升PostgreSQL性能的五個(gè)技巧

    這篇文章主要介紹了Instagram提升PostgreSQL性能的五個(gè)技巧,Instagram的數(shù)據(jù)庫一直由PostgreSQL支撐,經(jīng)驗(yàn)很具有參考性,需要的朋友可以參考下
    2015-04-04
  • 分享三種高效率SQL語句分頁方法

    分享三種高效率SQL語句分頁方法

    分享三種高效率SQL語句分頁方法,需要的朋友可以參考下。
    2011-09-09

最新評(píng)論