安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

阿里四面为何MySQL没有使用建立的索引?

1月5日 听雨眠投稿
  MySQL选了个不恰当索引而导致的慢查询。
  某晚收到了线上数据库的频繁报警,数据库突然大量慢查询,导致每个数据库连接执行一个慢查询都要耗费很久。这还导致突然过来的很多查询需要让MySQL开辟更多连接,因此报警也告诉我们,数据库的连接剧增,而且每个连接都打满,每个连接都要执行一个慢查询。
  接着DB的连接全部打满,无法开辟新连接,但还持续的有新的查询请求,导致DB无法处理新查询,很多查询发到DB直接就阻塞然后超时,导致商品系统频繁的报警,出现大量DB查询超时报错的异常。
  这意味着商品数据库及商品系统濒临崩溃,大量慢查询耗尽DB连接资源,而且一直阻塞在数据库里执行,数据库没法执行新的查询,商品数据库无法执行查询,用户没法使用商品系统,也就没法查询和筛选电商网站里的商品了。
  报警时机又正是晚高峰,虽说商品数据有多级缓存架构,但下单过程中,还是会大量请求商品系统,所以晚高峰时,商品系统本身TPS大致几千。因此发现数据库的监控里显示每min的慢查询超过10w:商品系统大量的查询都变成了慢查询。
  慢查询主要就是如下语句:用户在电商网站上根据商品品类及子类筛选按id倒序排序,最后分页selectfromproductswherecategoryxxandsubcategoryxxorderbyiddesclimitxx,xx
  该语句执行的商品表里大致1亿左右数据量,该量级已稳定很长时间,主要也就是这么多商品,但上面语句居然一执行就是几十s!基本上数据库的连接全部被慢查询打满,一个连接要执行几十s的SQL,然后才能执行下一个SQL,此时数据库基本就废了,没法执行什么查询。所以商品系统本身也报警查询数据库的超时异常。为什么会出现这样
  经常用到的查询字段肯定都建了索引,即indexcategory(catetory,subcategory)肯定存在。因为如果你一旦用上了品类索引,按品类和子类去在索引里筛选:筛选很快速筛出来的数据不多
  理论上执行速度很快,即使表有亿级数据,但也不应超过1s。但跑了几十秒,说明肯定没用那个索引,看执行计划:explainselectfromproductswherecategoryxxandsubcategoryxxorderbyiddesclimitxx,xx
  possiblekeysindexcategory的,keyPRIMARY,ExtraUsingwhere
  就是在扫描主键索引,还用where条件里的两个字段做筛选,所以这么扫描就会耗费几十s。解决方案
  为快速解决问题,使用forceindex语法,强制改变MySQL自动选择不恰当聚簇索引进行扫描的行为:selectfromproductsforceindex(indexcategory)wherecategoryxxandsubcategoryxxorderbyiddesclimitxx,xx
  再次执行SQL,仅耗费100多ms。
  所以若MySQL使用了错误的执行计划,那就forceindex语法改变它。
  但案例还有问题:为何MySQL会选择扫描主键索引?为何不用indexcategory二级索引扫描?即使用了聚簇索引,为何该SQL之前没有问题,现在突然就有问题了?
  该表是个亿级数据量大表,那indexcategory二级索引也比较大,所以此时MySQL觉得如果从indexcategory二级索引查找符合where条件的一波数据,接着还得回表。因为要select,所以必然涉及回表,但在回表前,必然要做完orderbyiddesclimitxx,xx操作。
  举个例子,根据wherecategoryxxandsubcategoryxx,从indexcategory二级索引里查找出一波数据,假设几万条,
  因为二级索引包含主键id,就得按orderbyiddesc,对这几万条数据基于临时磁盘文件进行lesort磁盘排序,排序后,再按limitxx,xx语法将指定位置的几条数据拿出来,假设limit0,10,那么就是把10条数据拿出来。拿出来10条数据之后,再回到聚簇索引根据id查,把这10条数据的完整字段都查出来,这就是MySQL认为如果你使用indexcategory的话,可能会发生的一个情况。
  所以他担心,你根据wherecategoryxxandsubcategoryxx
  从indexcategory二级索引里查出来的数据太多了,还得在临时磁盘里排序,可能性能很差,因此MySQL就把这种方式判定不太好。
  因此他选择直接扫描主键的聚簇索引,因为聚簇索引按id值有序,所以扫描时,直接按orderbyiddesc倒序得顺序扫描即可,然后因为他知道你是limit0,10
  也就知道你仅仅只要拿到10条数据就行了。所以他在按序扫描聚簇索引时,就会对每条数据都采用Usingwhere,跟wherecategoryxxandsubcategoryxx
  条件进行比对,符合条件的就直接放入结果集里去,最多就是放10条数据进去就可以返回了。
  此时MySQL认为,按顺序扫描聚簇索引,拿到10条符合where条件的数据,应该很快,很可能比使用indexcategory二级索引更快,因此此时他就采用了扫描聚簇索引的这种方式。
  这SQL之前在线上系统运行一直没问题,即之前在线上系统而言,即使采用扫描聚簇索引,该SQL也确实运行不慢,最起码是不会超过1s。
  为何突然大量报慢查询,耗时几十s?因为之前wherecategoryxxandsubcategoryxx
  条件通常有返回值,即根据条件里的取值,扫描聚簇索引,通常都是很快就能找到符合条件的值并返回,所以之前其实性能也没啥问题。
  但后来可能是商品系统里的运营人员,在商品管理的时候加了几种商品分类和子类,但是这几种分类和子类的组合其实没有对应的商品,导致很多用户使用这种分类和子类去筛选商品wherecategory新分类andsubcategory新子类
  条件实际上是查不到任何数据的!所以扫描聚簇索引时,怎么都扫不到符合条件的结果,一下就把聚簇索引全部扫了一遍,等于上亿数据全表扫描一遍,都没找到符合wherecategory新分类andsubcategory新子类这个条件的数据。
  正因如此,才导致这个SQL语句频繁的出现几十秒的慢查询,进而导致MySQL连接资源打满,商品系统崩溃!总结
  SQL调优并不太难,核心是看懂SQL执行计划,理解慢的原因,然后想法解决,本案例就得通过forceindex语法来强制某个SQL用我们指定的索引。
投诉 评论

过年回家7天我确定了iPhone13Pro和骁龙8谁是更好的iPhone13Pro骁龙8因为热岛效应的存在,所以乡下比城市会更冷一些。在南方冬天的我原本只需要穿一件稍微厚一点的外套,里面一件内衬就可以过冬,回了老家那就要冻得手脚冰冷,玩……又砸120亿!欲与宁王争锋,欣旺达半年500亿押宝动力电池本报记者李春莲见习记者张军兵刚获得车企增资的欣旺达,正充足了电往动力电池赛道加速冲刺。3月1日晚,欣旺达公告称,子公司拟与珠海市人民政府签署项目投资协议,投建珠海3……238个项目入选河北省2022年工业互联网创新发展重点培育项我省发布2022年工业互联网创新发展重点培育项目238个项目入选总投资额超35亿元河北新闻网讯(河北日报记者米彦泽)日前,省工信厅发布2022年河北省工业互联……时隔两年回归!小米CC11系列强势来袭,这次不止是影像提到小米CC系列,很多人对该系列新机的印象应该还是很深刻的。2019年小米在推出CC9系列之后,凭借着全球首发1亿像素主摄,配合上出色的调教算法,直接在DXO榜单上成为了和华为……在乡村振兴政策下,运营商如何才能抓住农村市场?自从2020年全面脱贫后,国家在乡村振兴上发布了很多政策,希望能用信息化的方式助力三农,发展美丽乡村,与智慧城市同步,作为三大运营商之一的中国联通,在广大的乡镇该如何做,做哪些……东丽开发出支持快充的纯电动车零部件材料,充电时间可减半日经中文网12月29日消息,总部位于日本的高科技跨国企业东丽开发出支持快速充电的汽车部件材料,纯电动汽车充电时间可比过去缩短一半。据介绍,这是一种即使在高电压下也不破损的……今日加密市场消息一览1。影星史泰龙宣布将在以太坊上推出NFT社区PlanetSLY,并将发布名为SlyGuys的首批NFT系列,总发行量为9,997枚,预计将于今年四月向公众开放出售,史泰龙本人将……中概股起伏不定,手持股票的大厂人麻了大厂小事记者陆柯言徐诗琪佘晓晨伍洋宇编辑文姝琪一年又白干了。看到自家公司股票曲线的变动,张腾开始自嘲起来。他在腾讯干了快五年,手里的腾讯股票能在广州付一套不错的首付。除此之……阿里四面为何MySQL没有使用建立的索引?MySQL选了个不恰当索引而导致的慢查询。某晚收到了线上数据库的频繁报警,数据库突然大量慢查询,导致每个数据库连接执行一个慢查询都要耗费很久。这还导致突然过来的很多查询需……GalaxyFold3和Flip3今天在全球发布会,元界粉丝今年美国预购量超过GalaxyZ销量。。。10至2月130个国家即将推出美国纽约花园城的三星体验店〔三星电子提供。禁止转售和DB〕(首尔韩联社)记者Seong……一加小米旗舰怎么选?看看这两款就知道了一加9Pro一加9Pro最近还是提升了很多,最近鲁大师公布了今年上半年手机UI流畅榜,其中一加9Pro装配的ColorOSforOnePlus系统位居第4。并且最为流行的……放弃三零手机重启魅蓝品牌魅族一夜回到三年前?如果不是今天魅蓝手机的官宣,可能都没多少人注意到,这个品牌已经离开我们1269天了。那这个品牌带给我们的最后一款新品是什么?大概是2018年夏天的魅蓝6T,已经快记不清了。为什……
2022年魅族发布了699元的手机,曾经的国产手机老大哥怎么未来科技,屏下摄像头手机大盘点,哪一款才是你的菜?数字经济跨步向前护好隐私才能留住流量现货的红米K40为什么突然不香了?米粉的回答很实在,说到心坎信息超材料为6G做前瞻铺垫姚振华坚持实业报国宝能集团聚创新能源高价值发明专利获授权一只耳朵没有听力,另一只耳朵听力也不好,怎么保护好残余听力?鸿蒙新机被炒到29999元!堪称年度理财产品,真有这么香吗?家里备台汉印照片打印机,留下动态的美好记录小白挑战学c语言第十天文件操作以算法对算法浙江外卖在线为互联网监管蹚路8K电视新款齐亮相,全民8K还会远吗祝朋友春分快乐祝福语宝宝误食异物的紧急处理方法有哪些胡萝卜炒鸡蛋滋补明目新娘头纱的种类明年的iPhone15系列会有哪些升级?国米26岁悍将全方面碾压老队长,却仍未得主帅信任,内拉呼吁上恋母情结的男性其实更是自卑男个石菖蒲治失眠验方失眠的个食疗小偏方管理者应该如何对待员工桶装水多少斤机选号码(常州彩民随机选择5注号码)幼儿园小班安全教案

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利