欧美一区二区三区影视_九色porny丨国产精品_色婷婷综合网_日韩精品欧美精品_日本另类视频_捆绑调教美女网站视频一区_高清在线不卡av_亚洲欧洲www

in用不用索引,啥時候能用啥時候不能用,一文說清-即時看

作者: 來源: 博客園 2023-06-18 10:13:59

 

in/or到底能不能用索引應該是肯定的,但有時生效有時不生效,這個能不能量化計算?這是本文想討論和解答的問題。

in到底用不用索引感覺像一樁懸疑片!古早時期的面經,統一說不走索引,在一些程序員腦海中從此留下不可磨滅的印記。有些從業時間較長的程序員腦子里的第一反應就是不走索引,上個月我就曾經被同事這樣質疑過。


(相關資料圖)

但是那是mysql5.5以前的老黃歷了,現在都到8.0+了,5.5(甚至更早)以后可以肯定的是它會走索引。但必然走索引嗎?不一定。

我搜索引擎上搜索關鍵詞 in/or索引,出來一大片文章,一般都會說,in/or能走索引,但后面跟的條件個數多了就不走索引了。但問題就來了,這個多了到底是多少才算多?對于一個動態查詢的SQL,我咋知道到底走不走索引?如何量化計算呢?

這時候就語焉不詳或者直接跳過。

大名鼎鼎的《阿里巴巴JAVA開發手冊》倒是一刀切。最好不超過1000。

人家這規范只是推薦,也不是強制,是吧,不能吐槽。

而且超過1000就算用上了range級別的查詢,那可能也快不到哪里去啊,對于要求快速響應的互聯網需求來說這推薦好像沒毛病。

但這不是重點,今天的重點在于,我一定要搞清楚,在保證explain的type為range而不是ALL全表掃描的前提下,到底select * from table where id in (1,2,3.....x)這個x能到多少。

問題

首先建一張測試表,來一步復現一下,走與不走索引的情況。

mysql

版本:5.7.19引擎:innodb

創建一個測試表

CREATE TABLE `t_person` (  `id` int(11) NOT NULL,  `name` varchar(10) COLLATE utf8_bin DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

使用SQL

EXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1)

查看執行計劃

此時表里無數據,顯示的是no matching row in const table.

少量數據

插入一條數據insert t_person (id,name) values(1,"張三")

使用SQL

EXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1)

查看執行計劃

使用了索引,還是效率最高的const(system生產環境不可能的吧),此時id in(1)相當于 id = 1

在in里增加點條件。

sql變成EXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1, 2)

查看執行計劃

使用了索引,但級別下降到了range,即范圍索引。

繼續在in里增加條件。

sql變成EXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1, 2,3)

查看執行計劃

索引級別變成了ALL,即全表掃描,其實是索引失效了。

再往表里插入兩條數據。此時總共3條數據。

insert t_person (id,name) values(2,"李四")insert t_person (id,name) values(3,"王五")

再使用sqlEXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1, 2,3)

查看執行計劃

可以看到,隨時表數據的增加,同樣的sql執行計劃從ALL變回了range,索引又生效了。

同樣地,再增加一個in條件,EXPLAIN SELECT id, NAME FROM t_person WHERE id IN (1,2,3,4)的執行計劃又變回了ALL,這里就不放圖了。

多點數據

以上只是小打小鬧撒撒水啦,總共幾條數據,in的條件都快超過表數據了,執行計算都不用預估就知道全表掃描還好一點啦。

我再往表里插入100萬條數據。

我先按照阿里的開發規范推薦的1000這個值作為臨界值,先使用900個條件

再使用1100個條件

上圖表明,這兩種情況都使用到了range范圍索引呢。

再加大劑量,直接上10萬。

步子邁大了,咔,這下終于全表掃描了。

但是還是沒找到臨界值。

官網上尋找答案

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

我在這里尋找到了一個參數,描述的倒像是相似的問題。

這個方法說的是當使用in或or查詢時,比如where in(1,2,3),執行引擎會先預估表中的數量,表中的數量將決定使用的查詢方式,比如,如果表中只有3條數據,那么很明顯,這時候直接全表掃描。

而這個預估的方法有2種,一是dive到index中即利用索引完成元組數的估算,簡稱index dive; 二是使用索引的統計數值,進行估算.

相比這2種方式,在效果上:

index dive: 速度慢,但能得到精確的值(MySQL的實現是數索引對應的索引項個數,所以精確)

index statistics: 速度快,但得到的值未必精確.

eq_range_index_dive_limit這個參數確實跟今天的主題相關系數不大。很明顯,這個值在mysql 5.7是200, 一開始的in后面的條件個數就是900,依然是走了range索引的。

stackoverflow

于是我找到了stackoverflow,在上面把msyqlincount這些關鍵詞搜了一下,沒有找到相關的問題。

然后我把問題詳細描述了一下,提了一個新的問題,沒想到啊,半個小時不到,人家就直接給我點踩,并給出了相似的已解答問題。

尷尬了。我超喜歡stackoverflow,這里的人個個都是人才。

相似的問題在這里。

https://stackoverflow.com/questions/72361880/mysql-in-operator-on-large-number-of-values

這位仁兄也在in的使用中也有很多問號,in的條件卡在14000左右,超過就失去了range索引。

下面高贊答案提到了一個參數,range_optimizer_max_mem_size ,一看就很有搞頭啊。

轉到mysql官網,憑我的渣渣英語也能看明白,我知道,大概我找到答案了。

https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#equality-range-optimization

要控制范圍優化器可用的內存,使用range_optimizer_max_mem_size系統變量:

值為0表示“沒有限制”。

當值大于0時,優化器將跟蹤在考慮范圍訪問方法時所消耗的內存。如果即將超過指定的限制,則放棄范圍訪問方法,轉而考慮其他方法,包括全表掃描。這可能不太理想。如果發生這種情況,會出現以下警告(其中N是當前的range_optimizer_max_mem_size值)。

現在事情就很簡單了。

range_optimizer_max_mem_size默認是8M,使用同樣的SQL,in后面同樣的條件為固定的19900個,在range_optimizer_max_mem_size=8M,range_optimizer_max_mem_size=8情況下分別執行一下看效果。

range_optimizer_max_mem_size=8M時,走range索引。

range_optimizer_max_mem_size=8時,走ALL全表掃描。

破案了!

明明官網上就有答案,我卻三過家門而不入。

結論

in兩種情況會走全表掃描。

in后面條件導致sql大小超過range_optimizer_max_mem_size。in后面條件個數接近或者等于表數量,執行引擎認為此時全表掃描更加合適。

推而廣之,or也是一樣的道理。歸根結底都是范圍查詢。

當然,總體來說,in后面條件越少越好,假設一張表有1000萬條數據,in后面的條件有10000個,這時候就算走了range索引,估計效率也好不到哪里。

完 

關鍵詞


相關文章
国产精品欧美极品| 国产欧美一级| 香蕉成人在线| 黄色免费在线观看| 精品视频久久久| 日韩电影中文字幕在线观看| 亚洲大型综合色站| 亚洲国产一区二区三区a毛片| 久久亚洲天堂| 欧美大片拔萝卜| 久久人人超碰精品| 四虎成人av| 色开心亚洲综合| 亚洲国产精品视频| 国产情侣久久| 日本欧美一区二区三区| 久久久久亚洲| 91精品国产自产在线丝袜啪| 一区二区三区视频网站| 中文字幕网在线| 韩日av一区二区| 91精品在线观看国产| 精品国产欧美日韩一区二区三区| 日本中文字幕视频在线| 日本高清在线观看wwwww色| 黄色在线网站噜噜噜| 国产成人77亚洲精品www| 给我免费播放日韩视频| 亚洲精品中文字幕99999| 日韩成人综合| 欧美在线一级| 欧美一级做a| av影视在线看| 成人区精品一区二区不卡| 小明精品国产一区二区三区| 91精品在线观看入口| 成人的网站免费观看| 第一社区sis001原创亚洲| 欧美一区=区三区| 99久久久久国产精品| 日韩大片在线| 国语一区二区三区| 日韩一区二区三区精品| 91九色综合| 日韩免费高清av| 亚洲福利小视频| 亚洲电影免费观看高清完整版在线 | 思思99re6国产在线播放| 91豆麻精品91久久久久久| 国产乱人伦精品一区二区在线观看 | 性久久久久久久| 中文在线免费一区三区高中清不卡| 欧美性猛交xxxx黑人猛交| 国产视频在线观看一区二区| 在线亚洲+欧美+日本专区| 色婷婷亚洲精品| 88在线观看91蜜桃国自产| 7777精品伊人久久久大香线蕉超级流畅 | 男女污视频在线观看| 欧美欧美欧美欧美首页| 亚洲福利视频一区二区| 国产婷婷色一区二区三区在线| 国产电影精品久久禁18| 制服诱惑一区二区| 一区二区三区在线电影| 动漫3d精品一区二区三区乱码| 色综合桃花网| 国产 日韩 欧美 综合 一区| 久久电影一区| 国产精品伦理在线| 91小视频在线观看| 国产色一区二区| 欧美日韩激情美女| 亚洲综合激情网| 日韩国产精品91| 91小视频免费看| 亚洲成av人综合在线观看| 91麻豆精品国产91久久久更新时间 | 国内在线免费视频| 麻豆蜜桃在线| 亚洲人成在线网站| 麻豆久久一区| 色网址在线观看| 六十路在线观看| 日韩精品视频无播放器在线看| 国产99re| 麻豆传媒视频在线观看免费| 国产精品一国产精品| 91麻豆免费视频| 欧美性xxxxx极品娇小| 欧美色中文字幕| 亚洲经典中文字幕| 国产综合在线观看| а√天堂资源地址在线下载| 午夜神马福利影院| av中文字幕在线看| 精品视频国产| 精品一区二区三区香蕉蜜桃| 欧美丝袜一区二区| 免费观看在线黄色网| 欧美xxxx中国| 在线免费观看日本欧美| 国产视频精选在线| 欧美日韩中文字幕一区二区三区 | 精品欧美乱码久久久久久| 日韩av资源| 黄色小视频在线观看| 神马日本精品| 日韩精品免费专区| 亚洲午夜在线视频| 免费黄色网页| 免费在线小视频| 精品国产99| av亚洲精华国产精华精华| 欧美伊人精品成人久久综合97 | 导航福利在线| 高清不卡一区| 久久久综合网| 热久久国产精品| 极品美女销魂一区二区三区 | 国产精品久久久久影院色老大| 亚洲第一精品夜夜躁人人爽| 国产精品亚洲欧美一级在线| 亚洲欧美一区二区三区国产精品| 在线视频尤物| 久久精品成人| 成人伦理视频网站| 日韩欧美精品综合| 大桥未久av一区二区三区| 三级网站视频在在线播放| 亚洲色图丝袜| 国产精品国产三级国产aⅴ中文 | 成人亚洲精品久久久久软件| 国产精品少妇自拍| 欧美精品久久天天躁| freemovies性欧美| 日韩午夜一区| 亚洲第一区中文99精品| 岛国片av在线| 亚洲精品久久| 精品美女国产在线| 少女频道在线观看高清| 欧美日韩一区二区三区四区不卡| 国产一区毛片| 欧美午夜视频在线观看| 大香伊人久久| 亚洲一区二区三区| xxxx影院| 日本午夜一区| 欧美日韩国产精选| 国产影视一区| 日韩欧美国产精品一区| 亚洲国产精品久久久天堂| 欧美性videos高清精品| 欧洲亚洲一区二区三区| 国产欧美一区二区精品久导航| 在线看你懂得| 影音先锋在线一区| 亚洲美腿欧美偷拍| 岛国av免费在线观看| 精品中文字幕一区二区小辣椒| 欧美成人福利视频| 国内精品偷拍| 成人高清免费观看| 亚洲第一在线视频| 伊人成综合网站| 日本免费新一区视频| 日本在线天堂| 欧美激情一区二区三区不卡| 欧美另类tv| 国产麻豆精品一区二区| 日韩精品在线观看一区| 欧洲视频一区| 欧美午夜精品一区| 欧美人与动xxxxz0oz| 日本美女视频一区二区| 色综合天天在线| 欧美黑人巨大xxxxx| 成人手机在线视频| 大胆av不用播放器在线播放| 99久久综合色| 久久人人视频| 国产午夜精品麻豆| 国产黄色91视频| 国产日韩欧美中文在线| 亚洲国产美女搞黄色| 清纯唯美日韩| 啊啊啊啊啊啊啊视频在线播放| 日韩av午夜在线观看| 九色视频网站| 韩国女主播成人在线| 天堂在线中文资源| 日韩理论电影| 亚洲精品少妇网址| 天天做天天爱天天综合网| 亚洲高清一二三区| 美国av一区二区| 国产特黄在线| 日韩电影在线一区| 色播视频在线观看|