MySQL的in和or的效率問題


轉自:MySQL的in和or的效率問題淺析

一、背景
今天有個朋友問題“MySQL的In語句和or哪個效率更高一些?”

對於這個問題大多數人可能都是通過百度直接拿答案,然后就沒然后了。

本文將對此問題簡要進行分析。

二、分析
接下來我們要干啥??我們應該去百度對吧?!

別急,我們的套路是想想有哪些可以查詢和解決這個問題的途徑。

2.1 自己動手豐衣足食
自己創建一個表,然后塞n多數據,分表將查詢的字段無索引和創建唯一索引,創建普通索引都對比一下。

(我這里暫時不做)

可以得到一些親身的經驗。

2.2 看源碼
MySQL明顯不是Java寫的,而且捯飭源碼不容易,我們還是先放棄吧。

2.3 搜索引擎
我們搜到了一篇,有類似的 https://www.cnblogs.com/lixiuyuan999/p/6368871.html

做了一些實驗結論如下:

結論:

1.in或or在字段有添加索引的情況下,查詢很快,兩者查詢速度沒有什么區別;

2.in或or在字段沒有添加索引的情況下,所連接的字段越多(1or2or3or4or......),or比in的查詢效率低很多

都有一些其他的類似結論,確實可以直接得到答案挺省事,但是總感覺不太權威。

2.4 SOF
其實可以在google里搜,但是你懂得....

我們還是從StackOverFlow里搜吧。

我們搜到了一些答案,典型的如下:

https://stackoverflow.com/questions/782915/mysql-or-vs-in-performance

 

我們知道有人做了實驗,通過他的對比,也是In的效率更高。

 

還有這個回答

 

我們了解了更多,知道了在很多數據庫里In和or是等價的,因為他們邏輯是相等的。

但是在MySQL中會對in中的列表排序,排序用的是二分查找來判斷是否在列表中。in的時間復雜度是O(logn)而or的時間復雜度是O(n),這就意味着In的效率更高。

另外還有人說范圍查找比in效率還高!!

還有一些其他的說法,讓我們大開眼界。

雖然如此,我們還是不放心怎么辦??處女座,強迫症腫么辦??

2.5 官方文檔大法
https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in

 

和上面的2.4第二個解釋非常類似。效率很高。

 

三、問題來了
總體來說,In的效率更高一些。

那么MySQL中in有沒有長度限制???
前面幾個步驟就不重復了,直接看官方手冊https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#function_in

The number of values in the IN list is only limited by the max_allowed_packet value.

in的數據量受限於 max_allowed_packet的值。

很貼心的給了我們一個超鏈接https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_max_allowed_packet

 

 max_allowed_packet表示最大允許接收的包大小。mysql 8.02及其之前版本默認大小是4194304字節(即4M)。

 

到此結束了??no!!
大概可以傳多長的字符呢??

如果都是數字和字母,則按一個字符1字節,默認可傳400多萬個字符,因此常規使用不用擔心。

啥時候需要調呢?

官方貼心的告訴你:

You must increase this value if you are using large BLOB columns or long strings. It should be as big as the largest BLOB you want to use. The protocol limit for max_allowed_packet is 1GB. The value should be a multiple of 1024; nonmultiples are rounded down to the nearest multiple.

官方貼心地提示你:

如果你用大blob列或者長字符串必須設置大一些。應該是你可能用到的最大BLOB的大小。協議限制1GB。這個值必須設置為1024的倍數,如果不是則自動取最近的1024的倍數字節。

 
結束了?
請看官方在線文檔的左下角,官方很貼心得為我們提供了PDF格式的電子書,提供了HTML格式電子書等。

難道不感動嗎?難道有理由不去下載嗎?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM