最新要闻
- 港人北上消费升温 香港零售业对人流量持乐观态度_世界新消息
- 世界百事通!理想MPV设计手稿曝光 李想:设计灵感不是和谐号 而是鲸鱼
- 女儿高考完提出3个要求妈妈崩溃:养了个祖宗|天天速看
- 土星卫星首次发现高浓度磷元素 地外生命真的存在?
- 美商海盗船发布新款DARKSTAR鼠标:15个可编程按键
- 2399元的RTX 4060即将开卖 专家称英伟达还得涨:显卡份额突破76%
- [路演]金杨股份首次公开发行股票并在创业板上市网上路演今日在全景网成功举办
- 世界简讯:网易云心动模式为什么会播不是喜欢的音乐(网易云的心动模式在哪)
- 新美男记_关于新美男记简介
- 当前资讯!高考考生们这些“套路”骗局要当心:千万别信
- 环球观热点:小哥十米高跳江救人!老家张家界奖励10万元外加一套房
- 16针显卡供电接口闯大祸!第一次把电源烧了
- 全球实时:HDD硬盘被垄断 倪光南院士:SSD取代的时机到了
- iPhone 15 Pro Max影像这下拉满了!看不到短板
- 景区观光车这价格,吃相太难看了
- 环球热讯:两部门印发文件部署高校毕业生档案转递接收工作
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
结案了!in到底用不用索引,啥时候能用啥时候不能用-天天新消息
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,在上面把msyql
in
count
这些关键词搜了一下,没有找到相关的问题。
然后我把问题详细描述了一下,提了一个新的问题,没想到啊,半个小时不到,人家就直接给我点踩,并给出了相似的已解答问题。
尴尬了。我超喜欢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索引,估计效率也好不到哪里。
完关键词:
结案了!in到底用不用索引,啥时候能用啥时候不能用-天天新消息
lua中 . 和 : 的区别
港人北上消费升温 香港零售业对人流量持乐观态度_世界新消息
前沿资讯!欧盟机构:6月初全球平均气温创纪录
世界百事通!理想MPV设计手稿曝光 李想:设计灵感不是和谐号 而是鲸鱼
女儿高考完提出3个要求妈妈崩溃:养了个祖宗|天天速看
土星卫星首次发现高浓度磷元素 地外生命真的存在?
美商海盗船发布新款DARKSTAR鼠标:15个可编程按键
2399元的RTX 4060即将开卖 专家称英伟达还得涨:显卡份额突破76%
[路演]金杨股份首次公开发行股票并在创业板上市网上路演今日在全景网成功举办
世界简讯:网易云心动模式为什么会播不是喜欢的音乐(网易云的心动模式在哪)
元数据在数字化时代中的应用与发展
记录--设计一个可选择不连续的时间范围的日期选择器
聊聊Flink的必知必会(三)
【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专访 天天短讯
即时焦点:曝光!Apache SeaTunnel Catalog 功能设计为何能大大简化用户启用步骤?
财政部:1-5月全国一般公共预算收入同比增长14.9% 一般公共预算支出同比增长5.8%
新美男记_关于新美男记简介
当前资讯!高考考生们这些“套路”骗局要当心:千万别信
环球观热点:小哥十米高跳江救人!老家张家界奖励10万元外加一套房
16针显卡供电接口闯大祸!第一次把电源烧了
全球实时:HDD硬盘被垄断 倪光南院士:SSD取代的时机到了
iPhone 15 Pro Max影像这下拉满了!看不到短板
景区观光车这价格,吃相太难看了
环球热讯:两部门印发文件部署高校毕业生档案转递接收工作
Kubernetes 1.27.2集群安装|每日热讯
单体服务,微服务服务的演变 & 各自优缺点
世界观焦点:javaScript基础语法之正则表达式
国网集安市供电公司:开展端午节前作风建设监督检查
世界要闻:比法拉利更抢眼!理想设计师亲自“泄密” W01设计手稿公布
苦中作乐!广东暴雨积水成河:有人屋内钓鱼 外卖车成水上摩托-当前滚动
快报:顾客遇账单刺客8碗米饭要90元 餐厅反驳:为了拍段子蹭流量
热到怀疑人生!今年“烧烤模式”来得早
每日视讯:RTX 4080显卡杀到8399元 铭瑄618全程价保:硬核装备开抢
FOreverLove什么意思中文
全球热门:远程办公篇-vscode远程SSH开发
和必应对话之mysql分区分表
天天日报丨位运算与集合
镜像,容器,容器数据卷,DockerFile 相关命令 使用总结 全球资讯
今日视点:胸部怎样才算不下垂_胸部怎样才能变大
全球今日讯!Facebook首席AI专家表示, 大语言模型只是昙花一现
好多明星去看了梅西比赛:陈妍希、苏醒等人都在现场_全球快播
世界看热讯:余承东:比亚迪是未来能活下来的巨头之一 华为能帮车企活下来
余承东:问界M5智能驾驶能力全球第一 超越特斯拉、国内外所有同行 天天快播
李一男造车梦“复活”自由家NV换标大乘V07已通过工信部申报
全球要闻:一口降温夏日必备!迷你可爱多冰淇淋官旗发车:每支不到1块钱
【天天速看料】邓一杰:黄金破1962,保守调仓,激进持仓!
当前头条:冬天适合在室内养什么植物_冬天室内养什么植物好 冬天适合室内种植的植物介绍
梅西ins发文感谢中国粉丝:开场81秒就进球 打破职业生涯记录 快看点
离谱!代驾设套碰瓷13名代驾同行:故意选土路蹭底盘 世界快消息
梅西直播被吐槽广告多?回应来了:纯聊天 没有带货_每日热议
苹果iPhone为何只有27W充电?原因可能有三 焦点速读
韩媒:韩国年轻人迷上中国App无法自拔 实在太好用了-全球讯息
速看:液冷概念股震荡走高 飞龙股份拉升封板
天天微头条丨CHAT-GPT初使用
唐源电气6月16日盘中跌幅达5%
男子突发奇想将甜瓜和西瓜嫁接 网友看完大笑:这是焊接_每日观察
环球观焦点:交通拥堵为何不禁私家车?这座一线城市要限电动自行车 只是试运行 专家吐槽
罕见!巨鸟撞碎玻璃卡在飞机舱,飞行员满脸血仍淡定驾驶……_全球今热点
热点!从0开始,精通Go语言Rest微服务架构和开发
Apache Spark教程_编程入门自学教程_菜鸟教程-免费教程分享
Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
【环球聚看点】实力登场 汉马动力携四款动力产品亮相上海GPOWER 2023动力展
陕西加强养老服务设施规划建设新建城区 新建居住(小)区配建养老服务设施
员工没完成业绩被罚吃苦瓜 公司:激励团队 都是自愿的
最新消息:买2套到手23件:黑人好来超白茶牙膏套装5支39.9元
坦克300坐不住了 全新一代北京BJ40曝光 你会选谁?
环球观热点:RTX轻薄本怎么选?不妨看看这三款:13499元的华硕灵耀Pro14 2023无可挑剔
世界观察:维珍银河计划月底进行首次商务飞行:数百名旅客将上太空
车祸轻伤害要求赔偿多少
每日快看:MySQL索引优化与查询优化
直播源码搭建平台技术知识:实时语音识别字幕呈现功能
有没有类似天龙八部的游戏_类似天龙八部的网络游戏|当前报道
赤座茜出场_赤座茜
滴滴发布橙意保障计划:9成网约车司机月均抽成低于20%
私人山庄被网红闯入并造谣为鬼屋吓得房主不敢回了 网友:请严惩_热闻
梅西回应被迫“宅”酒店 酒店外的球迷太疯狂:感谢所有中国球迷 环球资讯
新资讯:问界M5智驾版交付 首位女车主还是兰博基尼、劳斯莱斯车主
两月没开电池报废不保修?极氪电池质保权益升级:砍掉不合理条约
prscrn键在惠普键盘上哪个位置(prscrn)
雪佛兰萨博班,出演1750部电影的明星车,磁力悬挂控制系统-天天短讯
视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析
形式化分析之BAN逻辑
什么是SEO
当前滚动:国家发展改革委:统调电厂存煤达到历史新高 今年迎峰度夏电力保供有坚实的基础
全球微头条丨国家发改委:今年迎峰度夏电力保供有坚实基础
每日简讯:盐碱地治理之“沽源方案”
真叫“翔龙”了 哈弗全新插混SUV亮相:形似老卫士、搭载Hi4电四驱|世界热闻
女生摆摊卖鸡脚边卖边吃 网友:吃饱了收摊回家
二代骁龙8平板来了:后置双摄、全金属机身设计-世界关注
Win11新文件管理器砍掉部分功能!微软:大众用户不常用 天天新视野
全球讯息:供应链大佬发话!博世中国总裁:汽车企业做手机是吃饱了没事干
蓝色协议职业推荐 最强职业选择攻略[多图]
新消息丨驻马店市西平县大宗秋粮作物播种基本结束
珊子直播(珊子)_世界报道
奔驰新GLA怎么样及奥迪RS5怎么样
天天观点:在南极尿尿会被冻住吗?
特斯拉开启大促:Model 3后轮驱动版补贴8千元 贷款利率优惠 全球聚焦
权威媒体:不带偏见去看 中国相机镜头已开始超越日本厂商_世界最新
Win11+鸿蒙 618组队出击 华为MateBook E系列二合一笔记本实现年轻人Office自由