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

in用不用索引,啥時(shí)候能用啥時(shí)候不能用,一文說(shuō)清-即時(shí)看

作者: 來(lái)源: 博客園 2023-06-18 10:13:59

 

in/or到底能不能用索引應(yīng)該是肯定的,但有時(shí)生效有時(shí)不生效,這個(gè)能不能量化計(jì)算?這是本文想討論和解答的問(wèn)題。

in到底用不用索引感覺(jué)像一樁懸疑片!古早時(shí)期的面經(jīng),統(tǒng)一說(shuō)不走索引,在一些程序員腦海中從此留下不可磨滅的印記。有些從業(yè)時(shí)間較長(zhǎng)的程序員腦子里的第一反應(yīng)就是不走索引,上個(gè)月我就曾經(jīng)被同事這樣質(zhì)疑過(guò)。


(相關(guān)資料圖)

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

我搜索引擎上搜索關(guān)鍵詞 in/or索引,出來(lái)一大片文章,一般都會(huì)說(shuō),in/or能走索引,但后面跟的條件個(gè)數(shù)多了就不走索引了。但問(wèn)題就來(lái)了,這個(gè)多了到底是多少才算多?對(duì)于一個(gè)動(dòng)態(tài)查詢的SQL,我咋知道到底走不走索引?如何量化計(jì)算呢?

這時(shí)候就語(yǔ)焉不詳或者直接跳過(guò)。

大名鼎鼎的《阿里巴巴JAVA開(kāi)發(fā)手冊(cè)》倒是一刀切。最好不超過(guò)1000。

人家這規(guī)范只是推薦,也不是強(qiáng)制,是吧,不能吐槽。

而且超過(guò)1000就算用上了range級(jí)別的查詢,那可能也快不到哪里去啊,對(duì)于要求快速響應(yīng)的互聯(lián)網(wǎng)需求來(lái)說(shuō)這推薦好像沒(méi)毛病。

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

問(wèn)題

首先建一張測(cè)試表,來(lái)一步復(fù)現(xiàn)一下,走與不走索引的情況。

mysql

版本:5.7.19引擎:innodb

創(chuàng)建一個(gè)測(cè)試表

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)

查看執(zhí)行計(jì)劃

此時(shí)表里無(wú)數(shù)據(jù),顯示的是no matching row in const table.

少量數(shù)據(jù)

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

使用SQL

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

查看執(zhí)行計(jì)劃

使用了索引,還是效率最高的const(system生產(chǎn)環(huán)境不可能的吧),此時(shí)id in(1)相當(dāng)于 id = 1。

在in里增加點(diǎn)條件。

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

查看執(zhí)行計(jì)劃

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

繼續(xù)在in里增加條件。

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

查看執(zhí)行計(jì)劃

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

再往表里插入兩條數(shù)據(jù)。此時(shí)總共3條數(shù)據(jù)。

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)

查看執(zhí)行計(jì)劃

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

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

多點(diǎn)數(shù)據(jù)

以上只是小打小鬧撒撒水啦,總共幾條數(shù)據(jù),in的條件都快超過(guò)表數(shù)據(jù)了,執(zhí)行計(jì)算都不用預(yù)估就知道全表掃描還好一點(diǎn)啦。

我再往表里插入100萬(wàn)條數(shù)據(jù)。

我先按照阿里的開(kāi)發(fā)規(guī)范推薦的1000這個(gè)值作為臨界值,先使用900個(gè)條件

再使用1100個(gè)條件

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

再加大劑量,直接上10萬(wàn)。

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

但是還是沒(méi)找到臨界值。

官網(wǎng)上尋找答案

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

我在這里尋找到了一個(gè)參數(shù),描述的倒像是相似的問(wèn)題。

這個(gè)方法說(shuō)的是當(dāng)使用in或or查詢時(shí),比如where in(1,2,3),執(zhí)行引擎會(huì)先預(yù)估表中的數(shù)量,表中的數(shù)量將決定使用的查詢方式,比如,如果表中只有3條數(shù)據(jù),那么很明顯,這時(shí)候直接全表掃描。

而這個(gè)預(yù)估的方法有2種,一是dive到index中即利用索引完成元組數(shù)的估算,簡(jiǎn)稱index dive; 二是使用索引的統(tǒng)計(jì)數(shù)值,進(jìn)行估算.

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

index dive: 速度慢,但能得到精確的值(MySQL的實(shí)現(xiàn)是數(shù)索引對(duì)應(yīng)的索引項(xiàng)個(gè)數(shù),所以精確)

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

eq_range_index_dive_limit這個(gè)參數(shù)確實(shí)跟今天的主題相關(guān)系數(shù)不大。很明顯,這個(gè)值在mysql 5.7是200, 一開(kāi)始的in后面的條件個(gè)數(shù)就是900,依然是走了range索引的。

stackoverflow

于是我找到了stackoverflow,在上面把msyqlincount這些關(guān)鍵詞搜了一下,沒(méi)有找到相關(guān)的問(wèn)題。

然后我把問(wèn)題詳細(xì)描述了一下,提了一個(gè)新的問(wèn)題,沒(méi)想到啊,半個(gè)小時(shí)不到,人家就直接給我點(diǎn)踩,并給出了相似的已解答問(wèn)題。

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

相似的問(wèn)題在這里。

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

這位仁兄也在in的使用中也有很多問(wèn)號(hào),in的條件卡在14000左右,超過(guò)就失去了range索引。

下面高贊答案提到了一個(gè)參數(shù),range_optimizer_max_mem_size ,一看就很有搞頭啊。

轉(zhuǎn)到mysql官網(wǎng),憑我的渣渣英語(yǔ)也能看明白,我知道,大概我找到答案了。

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

要控制范圍優(yōu)化器可用的內(nèi)存,使用range_optimizer_max_mem_size系統(tǒng)變量:

值為0表示“沒(méi)有限制”。

當(dāng)值大于0時(shí),優(yōu)化器將跟蹤在考慮范圍訪問(wèn)方法時(shí)所消耗的內(nèi)存。如果即將超過(guò)指定的限制,則放棄范圍訪問(wèn)方法,轉(zhuǎn)而考慮其他方法,包括全表掃描。這可能不太理想。如果發(fā)生這種情況,會(huì)出現(xiàn)以下警告(其中N是當(dāng)前的range_optimizer_max_mem_size值)。

現(xiàn)在事情就很簡(jiǎn)單了。

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

range_optimizer_max_mem_size=8M時(shí),走range索引。

range_optimizer_max_mem_size=8時(shí),走ALL全表掃描。

破案了!

明明官網(wǎng)上就有答案,我卻三過(guò)家門(mén)而不入。

結(jié)論

in兩種情況會(huì)走全表掃描。

in后面條件導(dǎo)致sql大小超過(guò)range_optimizer_max_mem_size。in后面條件個(gè)數(shù)接近或者等于表數(shù)量,執(zhí)行引擎認(rèn)為此時(shí)全表掃描更加合適。

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

當(dāng)然,總體來(lái)說(shuō),in后面條件越少越好,假設(shè)一張表有1000萬(wàn)條數(shù)據(jù),in后面的條件有10000個(gè),這時(shí)候就算走了range索引,估計(jì)效率也好不到哪里。

完 

關(guān)鍵詞


相關(guān)文章
国产丝袜一区二区三区免费视频| 亚洲视频一区二区免费在线观看| 日韩欧美ww| 黄色网址三级| 亚洲特黄一级片| 亚洲黄网站黄| 另类专区亚洲| 亚洲色图欧美制服丝袜另类第一页| 国产日韩成人精品| 亚洲五月综合| av丝袜在线| 亚洲精选在线观看| 亚洲欧美成人一区二区三区| 亚洲精品影视| 99精品美女视频在线观看热舞 | 亚洲一区二区三区三| 国产婷婷精品| 亚洲国产天堂网精品网站| 日日骚欧美日韩| 国产高清自产拍av在线| 亚洲欧美精品伊人久久| 精品久久久免费| 国产不卡免费视频| 午夜一级久久| 欧美性xxxx极品高清hd直播| 日韩三级免费观看| 欧美日韩国产首页| 色婷婷久久久亚洲一区二区三区| 亚洲综合免费观看高清完整版| 亚洲欧美日韩一区二区三区在线观看| 国产精品美日韩| 国产精品影音先锋| 久久亚洲影院| 麻豆精品精品国产自在97香蕉| 国产精品美女视频| 亚洲精品视频中文字幕| 亚洲人成网在线播放| 在线免费中文字幕| av影视在线| 国产黄大片在线观看画质优化| 日韩精品资源二区在线| 亚洲人a成www在线影院| 丁香婷婷在线| 在线视频您懂的| 亚洲精品成a人在线观看| 91精品国产一区二区三区香蕉| 欧美特级www| 欧美xxxxxxxxx| 国产国产国产国产国产国产| 精品女厕厕露p撒尿| 在线看的你懂得| 日韩激情视频在线播放| 亚洲精美色品网站| 日韩精品一区二| 亚洲国产99精品国自产| 91在线观看入口| 男人天堂2020| 在线播放你懂的| fc2在线中文字幕| 久操视频在线播放| 男女啪啪在线观看| 中文字幕在线观看| 伊人久久青青草| 亚洲欧美激情精品一区二区| 欧美体内谢she精2性欧美| 亚洲电影激情视频网站| 成人免费一区二区三区在线观看 | 精品国产成人在线| 亚洲色图丝袜美腿| 亚洲国产日韩av| 欧美日本一区二区| 亚洲精品国产综合区久久久久久久| 欧美日韩精品一区视频| 欧美性xxxx极品hd欧美风情| 欧美一区二区三区在线看| 亚洲人a成www在线影院| 欧美激情午夜| 日本在线播放一二三区| 日韩免费特黄一二三区| 亚洲一区二区三区国产| 午夜小视频在线观看| 国产成人一区在线| 在线观看国产高清视频| 亚洲精品在线观看91| 亚洲一二三区在线观看| 96av在线| 蜜臀av国产精品久久久久| 久久久加勒比| 天堂在线中文字幕| h片精品在线观看| 2023国产精品久久久精品双| 国产欧美视频一区二区三区| 亚洲欧美激情精品一区二区| 日本免费精品| 仙踪林久久久久久久999| 成人在线视频首页| 色婷婷久久久综合中文字幕| 亚洲wwwww| 国产高清精品在线| 久久久久久77777| 99久久久成人国产精品| 99久久亚洲一区二区三区青草| 亚洲白虎美女被爆操| 国产拍在线视频| 福利一区和二区| 欧美亚洲在线| 欧美日韩亚洲不卡| 黄色在线观看www| 国产精品夜夜嗨| 福利视频在线导航| 97国产一区二区| 久久视频www| 美日韩一区二区| 日本不卡1区2区3区| 波多野结衣的一区二区三区 | 欧美日韩五月天| 色大18成网站www在线观看| 久久久噜噜噜久久狠狠50岁| 亚洲欧美日韩中文字幕一区二区三区 | 污污的网站在线看| 国产视频欧美| 曰韩精品一区二区| 小水嫩精品福利视频导航| 国产伦精品一区二区三区视频| 欧美国产精品专区| cao在线视频| 中文字幕av在线一区二区三区| 国产精品影视| 成人直播在线观看| 国产午夜三级一区二区三| 一广人看www在线观看免费视频| 先锋资源久久| 狠狠色丁香婷婷综合| hbad中文字幕| 第一社区sis001原创亚洲| 久久久久综合网| 欧美18一19xxx性| 成人一区二区视频| 国产白丝在线观看| 国产精品不卡在线| 福利小视频在线| 国产一区二区按摩在线观看| 人成在线视频| 精品国产中文字幕第一页| 欧美日韩一区二区欧美激情| 久久精品免视看国产成人| 成人av免费在线观看| 欧美一区二区三区在线观看| 超碰成人在线免费| 国产精品一区二区久久不卡 | 欧美香蕉大胸在线视频观看 | 精品国产一区二区三区小蝌蚪| 亚洲少妇30p| 国产免费视频在线| 欧美久久九九| 亚洲精选一区二区| 丁香婷婷综合激情五月色| 成年男女免费视频网站不卡| 精品国产31久久久久久| 免费av在线网站| 不卡的看片网站| 蜜桃av在线播放| 日韩欧美国产骚| 国产精品超碰| 日韩一区有码在线| 国产精品一区二区精品| 动漫精品一区二区| 日韩一区二区三区色| 制服丝袜亚洲播放| 国产乱人伦偷精品视频不卡| 成人国产网站| 欧美精品一区视频| 91麻豆国产精品久久| 91精品xxx在线观看| 色综合久久综合| 日韩精品一区二区三区免费观影 | 91蜜桃臀久久一区二区| 欧美精品一级二级| 欧美日韩亚洲一区三区| 黄页视频在线免费观看| 国产不卡在线视频| 四季久久免费一区二区三区四区| 韩日av一区二区| 麻豆系列在线观看| 日本一区免费视频| 综合综合综合综合综合网| 免费看成年人视频在线观看| 亚洲美女少妇撒尿| 色棕色天天综合网| 4438x亚洲最大成人网| 在线成人直播| 日韩电影第一页| 97精品中文字幕| 精品久久人人做人人爱| 亚洲观看高清完整版在线观看 | 精品福利一区二区| 欧美一区电影| 香蕉视频免费在线| 2014亚洲片线观看视频免费| 日韩a级大片|