mysql中關于between和in的區(qū)別
mysql中between和in的區(qū)別
下面兩條語句有什么區(qū)別,為什么都提倡使用范圍查詢 ?
select * from T where k in(1,2,3,4,5) select * from T where k between 1 and 5
其實between和in這兩個關鍵字應用的場景重合度并不高,但是我們可以通過思考這么一個問題,來理清這兩者執(zhí)行的執(zhí)行過程和邏輯。
要回答這個問題就需要先了解索引的數(shù)據(jù)結(jié)構(gòu),以及mysql索引利用b+樹執(zhí)行查詢的執(zhí)行過程,這里先默認大家具備了這個條件。
先區(qū)分下可能的情況。
第一個是k字段是主鍵,第二個是k字段是二級索引,第三種情況是k是普通字段。
另外,我們需要搞清楚in關鍵字和between兩種查詢方式在執(zhí)行的時候的不同之處;
- in關鍵字其實是等值查詢的合并,將多個等值查詢合并成一個,減少查詢和返回次數(shù);
- between查詢是典型的范圍查詢,在命中索引的情況下,會直接在查詢首個符合條件的數(shù)據(jù),然后根據(jù)指針一次獲取下一個葉子節(jié)點數(shù)據(jù)進行比較直到查詢到不符合條件的數(shù)據(jù)為止。
- 現(xiàn)在我們再來對三種情況進行梳理,
k是主鍵索引和二級索引的情況是相似的,唯一的區(qū)別就是二級索引的話可能需要回表,回表不是這次討論的重點,所以我們把這兩種情況合并到一起說;
in 條件實際查詢的時候是多次搜索索引樹,而 between 條件只需要執(zhí)行一次搜索樹的查詢就可以獲得結(jié)果,本題為例,加入索引的底層實現(xiàn)結(jié)構(gòu)使用的是b+樹,使用關鍵字 in 要樹搜素5次,也就是做5次等值查詢;而 bewteen 基于b+樹的范圍查詢邏輯,當找到第一個滿足條件的葉子節(jié)點后,根據(jù)當前葉子節(jié)點指向的下一個葉子節(jié)點繼續(xù)查詢,直到查到不滿足條件的葉子節(jié)點,所以只需要樹搜索一次。
而對于k不是索引的情況,in條件相當于執(zhí)行了多次的全文遍歷,而between其實也是全文遍歷,都不是一個好的方式。
mysql條件查詢語句between and和in的效率比較
工作需要,寫按sensor_uuid在某范圍查詢的語句:
1.
select * from xz_sensor_data where sensor_time>='2019-03-28 00:00:00.000' and sensor_time<='2019-03-28 08:00:00.000' and sensor_uuid in('20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','201901','201902','201903','201904','201905','201906','201907','201908','201909','201910','201911','201912','201913') ?order by sensor_time asc
2.
select * from xz_sensor_data where sensor_time>='2019-03-28 00:00:00.000' and sensor_time<='2019-03-28 08:00:00.000' and (sensor_uuid ?between '19' and '36' or sensor_uuid between '201900' and '201914' )
發(fā)現(xiàn)第二條執(zhí)行效率高。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
淺談Mysql中類似于nvl()函數(shù)的ifnull()函數(shù)
下面小編就為大家?guī)硪黄獪\談Mysql中類似于nvl()函數(shù)的ifnull()函數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02關于Mysql插入中文字符報錯ERROR 1366(HY000)的解決方法
這篇文章主要介紹了關于Mysql插入中文字符報錯ERROR 1366(HY000)的解決方法,在我們?nèi)粘J褂胢ysql的過程中會經(jīng)常遇到各種報錯,今天我們就來看一下ERROR 1366報錯的解決方法吧2023-07-07MySQL?數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型
這篇文章主要介紹了MySQL?數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型,下面文字圍繞數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型的相關資料展開詳細介紹,需要的小伙伴可以參考一下,希望對你有所幫助2021-12-12實現(xiàn)MySQL與elasticsearch的數(shù)據(jù)同步的代碼示例
MySQL 自身簡單、高效、可靠,是又拍云內(nèi)部使用最廣泛的數(shù)據(jù)庫,但是當數(shù)據(jù)量達到一定程度的時候,對整個 MySQL 的操作會變得非常遲緩,這個時候我們就需要MySQL與elasticsearch數(shù)據(jù)同步,接下來就給大家介紹如何實現(xiàn)數(shù)據(jù)同步2023-07-07