专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

开发大佬教你五步做好MySQLjoin语句优化

  在MySQL的实现中,NestedLoopJoin有3种实现的算法:
  1、SimpleNestedLoopJoin:简单嵌套循环连接
  2、BlockNestedLoopJoin:缓存块嵌套循环连接
  3、IndexNestedLoopJoin:索引嵌套循环连接
  MySQL8。0。18版本推出了hashjoin的方式以替代BNLJ(缓存块嵌套循环连接)。提高非索引的join操作查询效率,这篇有关hashjoin并没有整理,以后会整理的!一、原理篇1、SimpleNestedLoopJoin
  比如:SELECTFROMuseruLEFTJOINclasscONu。idc。userid
  我们来看一下当进行join操作时,mysql是如何工作的:
  当我们进行leftjoin连接操作时,左边的表是驱动表,右边的表是被驱动表
  特点:
  SimpleNestedLoopJoin简单粗暴容易理解,就是通过双层循环比较数据来获得结果,但是这种算法显然太过于粗鲁,如果每个表有1万条数据,那么对数据比较的次数
  1万1万1亿次,很显然这种查询效率会非常慢。这个全是磁盘扫描!
  因为每次从驱动表取数据比较耗时,所以MySQL即使在没有索引命中的情况下也并没有采用这种算法来进行连接操作,而是下面这种!2、BlockNestedLoopJoin
  同样以上面的sql为例,我们看下mysql是如何工作的SELECTFROMuseruLEFTJOINclasscONu。idc。userid
  因为每次从驱动表取一条数据都是磁盘扫描所有比较耗时。
  这里就做了优化就是每次从驱动表取一批数据放到内存中,然后对这一批数据进行匹配操作。
  这批数据匹配完毕,再从驱动表中取一批数据放到内存中,直到驱动表的数据全都匹配完毕。
  这块内存在MySQL中有一个专有的名词,叫做joinbuffer,我们可以执行如下语句查看joinbuffer的大小showvariableslikejoinbuffer
  思考,JoinBuffer缓存的对象是什么,这个问题相当关键和重要。
  JoinBuffer存储的并不是驱动表的整行记录,具体指所有参与查询的列都会保存到JoinBuffer,而不是只有Join的列。
  比如下面sqlSELECTa。col3FROMaJOINbONa。col1b。col2WHEREa。col20ANDb。col20
  上述SQL语句的驱动表是a,被驱动表是b,那么存放在JoinBuffer中的列是所有参与查询的列,在这里就是(a。col1,a。col2,a。col3)。
  也就是说查询的字段越少,JoinBuffer可以存的记录也就越多!
  变量joinbuffersize的默认值是256K,显然对于稍复杂的SQL是不够用的。好在这个是会话级别的变量,可以在执行前进行扩展。
  建议在会话级别进行设置,而不是全局设置,因为很难给一个通用值去衡量。另外,这个内存是会话级别分配的,如果设置不好容易导致因无法分配内存而导致的宕机问题。调整到1Msetsessionjoinbuffersize102410241024;再执行查询SELECTa。col3FROMaJOINbONa。col1b。col2WHEREa。col20ANDb。col203、IndexNestedLoopJoin
  当我们了解BlockNestedLoopJoin算法,我们发现虽然可以将驱动表的数据放入JoinBuffer中,但是缓存中的每条记录都要和被驱动表的所有记录都匹配一遍,
  也会非常耗时,所以我们应该如何提高被驱动表匹配的效率呢?其实很简单就是给被驱动表连接的列加上索引,这样匹配的过程就非常快,如图所示
  上面图中就是先匹配索引看有没有命中的数据,有命中数据再回表查询这条记录,获取其它所需要的数据,但列的数据在索引中都能获取那都不需要回表查询,效率更高!
  二、SQL示例1、新增表和填充数据表1a字段加索引b字段没加CREATETABLEt1(idintNOTNULLAUTOINCREMENTCOMMENT主键,aintDEFAULTNULLCOMMENT字段a,bintDEFAULTNULLCOMMENT字段b,PRIMARYKEY(id),KEYidxa(a))ENGINEInnoDBDEFAULTCHARSETutf8;表2createtablet2liket1;t1插入10000条数据t2插入100条数据dropprocedureifexistsinsertdata;delimiter;;createprocedureinsertdata()begindeclareiint;seti1;while(i10000)doinsertintot1(a,b)values(i,i);setii1;endwhile;seti1;while(i100)doinsertintot2(a,b)values(i,i);setii1;endwhile;end;;delimiter;callinsertdata();2、BlockNestedLoopJoin算法示例b字段没有索引explainselectt2。fromt1innerjoint2ont1。bt2。b;执行结果idselecttypetablepartitionstypepossiblekeyskeykeylenrefrowsfilteredExtra1SIMPLEt2NULLALLNULLNULLNULLNULL100100。00NULL1SIMPLEt1NULLALLNULLNULLNULLNULL1033710。00Usingwhere;Usingjoinbuffer(BlockNestedLoop)
  从执行计划我们可以得出一些结论:驱动表是t2,被驱动表是t1。所以使用innerjoin时,排在前面的表并不一定就是驱动表。Extra中的Usingjoinbuffer(BlockNestedLoop)说明该关联查询使用的是BNLJ算法。
  上面的sql大致流程是:将t2的所有数据放入到joinbuffer中将joinbuffer中的每一条数据,跟表t1中所有数据进行比较返回满足join条件的数据3、IndexNestedLoopJoin算法a字段有索引EXPLAINselectfromt1innerjoint2ont1。at2。a;
  执行结果
  从执行计划我们可以得出一些结论:我们可以看出t1的type不在是all而是ref,说明不在是全表扫描,而是走了idxa的索引。这里并没有出现Usingjoinbuffer(BlockNestedLoop),说明走的是IndexNestedLoopJoin。
  上面的sql大致流程是:从表t2中读取一行数据从第1步的数据中,取出关联字段a,到表t1idxa索引中查找;从idxa索引上找到满足条件的数据,如果查询数据在索引树都能找到,那就可以直接返回,否则回表查询剩余字段属性再返回。返回满足join条件的数据
  发现这里效率最大的提升在于t1表中rows1,也就是说因为idxa索引的存在,不需要把t1每条数据都遍历一遍,而是通过索引1次扫描可以认为最终只扫描t1表一行完整数据。三、join优化总结
  根据上面的知识点我们可以总结以下有关join优化经验:在关联查询的时候,尽量在被驱动表的关联字段上加索引,让MySQL做join操作时尽量选择INLJ算法。
  2)小表做驱动表!
  当使用leftjoin时,左表是驱动表,右表是被驱动表,当使用rightjoin时,右表是驱动表,左表是被驱动表,当使用join时,mysql会选择数据量比较小的表作为驱动表,
  大表作为被驱动表,如果说我们在join的时候明确知道哪张表是小表的时候,可以用straightjoin写法固定连接驱动方式,省去mysql优化器自己判断的时间。
  对于小表定义的明确:
  在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与join的各个字段的总数据量,数据量小的那个表,就是小表,应该作为驱动表。
  3)在适当的情况下增大joinbuffer的大小,当然这个最好是在会话级别的增大,而不是全局级别。
  4)不要用作为查询列表,只返回需要的列!
  这样做的好处可以让在相同大小的joinbuffer可以存更多的数据,也可以在存在索引的情况下尽可能避免回表查询数据。
  声明:公众号如需转载该篇文章,发表文章的头部一定要告知是转至公众号:后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!
  原文链接:https:www。cnblogs。comqdhxhzp16893154。html

震动A股!刚宣布千亿超级订单来了中国基金报记者李智光伏行业再现千亿大单!10月25日,大全能源宣布,与某客户签订了采购框架合同,合同约定2023年2028年某客户预计共向公司及内蒙古大全采购43。2万吨原生多晶硅517亿人民币!中芯国际正式官宣,台积电迎来最强对手华为是位于中国大陆的一家国产型企业,不过却因为其在5G领域方面的领先优势而被美方大力打压,特别是美方对华为在芯片领域的断供近些年来确实给华为的发展造成了巨大的困扰,原本华为在国内手南非游记(10)黄金之城约翰内斯堡世界著名的国际大都市参观完南非先民纪念馆,我们离开比勒陀尼亚,直接驱车前往约翰内斯堡。我们要到约翰内斯堡的一家中餐馆莲园餐厅吃晚餐。约翰内斯堡(英语Johannesburg),简称约堡(英语Jobur工业互联网数字经济核心底座,产业链龙头全梳理工业互联网逐渐成为数字经济创新发展的关键支撑,是新型基础设施建设的重要组成部分,是推动数字经济与实体经济深度融合的关键路径。受益于国家陆续出台对工业互联网发展的支持政策,工业互联网中国钠离子电池产业化发展加速,持续领跑世界中国锂离子电池发展之路历经艰辛,从曾经的技术落后,到如今引领世界,有太多人为之艰辛付出。虽然过程艰难,但成就斐然!如今,世界前十大动力电池厂商排名中,中国已经占有六席(第一宁德时代前三季度关键经济数据出炉国家统计局10位司长解读央广网北京10月24日消息24日,国家统计局公布了2022年前三季度主要经济数据指标情况。数据显示,2022年前三季度,我国GDP为870269亿元,按不变价格计算,同比增长3。0NHK日本铁路日失调铁道开通150周年已经成日本标配中国小康网10月24日讯老马10月14日是日本铁路日。日本铁路初创于150年前,即1872年10月14日(明治5年),在日本第一条新桥和横滨之间的铁路开通。2022年是铁路开通15二十大代表湖南大学党委书记邓卫为党育人为国育才,支撑社会主义现代化国家建设中国经济周刊记者郭志强北京报道党的二十大报告提出,教育科技人才是全面建设社会主义现代化国家的基础性战略性支撑。教育科技人才成为二十大代表热议的话题。人才和教育的关系就像鱼和水的关系日本球迷放弃伊藤美诚你已被国乒研究透,走上福原爱同样的路2022年WTT澳门冠军赛,国乒迎来了爆发日,提前包揽了男女单的金牌,其中面对日本的伊藤美诚,陈幸同在先丢一局后连赢四局,最终41晋级。日本球迷评论大多看衰伊藤美诚,认为她不再能威93分钟绝杀,21!世界杯4强诞生日本队出局,中国女足没遗憾U17女足世界杯迎来四分之一决赛的多场较量,日本女足在10领先的情况下遭到逆转,第87分钟和第93分钟,日本女足连丢2球,遭到绝杀,无缘4强,而哥伦比亚女足以30的比分淘汰了坦桑尼悲情6分钟!日本队轰然出局,世界杯4强中国队两大小组对手晋级北京时间10月22日晚到23日凌晨,U17女足世界杯又结束了两场14决赛,其中哥伦比亚队30坦桑尼亚队西班牙队21力克日本队。这其中,日本队遭遇了悲情6分钟,惨遭逆转轰然出局。日本
年中卡位战三家大行理财子规模罕见缩水,招银理财规模净利双双第一记者胡颖君随着半年报的密集披露,银行理财子公司的经营状况以及理财规模边际变化情况也随之公之于众。受股债市场震荡影响,上半年理财公司集体渡劫破净数量创新高业绩基准难以达到部分产品不得福建甲鱼被蚊子叮头肿成球,主人不忍放弃坚持救治,网友纷支招题记相生相克,真是冤家路窄作者南海看云世界真是奇妙,无论多么凶猛的动物,只要是生活在这个地球,就有它的对手,像蜈蚣与鸡就是天敌,蛇的克星是鹅鹅鹅那样。让这个世界变得更加相生相融。甲在中国文字博物馆感受文字之美8月24日,游客在中国文字博物馆内观看展览。暑假期间,众多市民走进中国文字博物馆,通过了解文字的发展历程,感受中华文明的魅力。位于河南省安阳市的中国文字博物馆是中国首座以文字为主题罕见天象金星凌日在某一时刻,地球金星太阳会在一条直线上,这时在地球的我们会看到,金星就像一个小黑点一样在太阳表面缓慢移动,天文学称之为金星凌日。不仅金星有凌日,水星也有凌日,而其它行星则没有。这是浙江舟山出现神秘仙岛,专家夜晚上岛调查,岛上空无一人在浙江嵊山就有一座传说中的仙岛,但是不知道出于什么原因,这座传说中的仙岛自从90年代开始,就很少有人居住,甚至如今已经空无一人。而当专家上岛调查后,却发现诡异一幕。这究竟是怎么一回李易峰被捕,昔日私会女主角网红湾湾的美照曝光,清秀俏皮可人李易峰被捕,昔日私会女主角网红湾湾的大量美照曝光,长得清秀俏皮可人。一夜之间,男艺人李易峰的人设彻底崩塌,三字男艺人和李易峰嫖娼的新闻铺天盖地。随着网上关于李易峰的黑历史被扒出,一黑龙江电信收入规模在三大运营商省公司排名第78名发展潜力大运营商财经网讯在近期推出的2022三大运营商省公司百强榜中,黑龙江电信排在第78名,可以预见其未来的发展潜力巨大。作为东三省运营商之一,黑龙江电信的发展其实并不算落后,人口经济的因上半年保费收入增长利润下降上市险企发力新渠道寻转型上半年保费收入增长利润下降上市险企发力新渠道寻求转型本报记者于泳日前,中国平安中国人寿中国太保等保险业上市公司半年报相继披露完毕。上半年,大部分上市险企的净利润出现不同程度下降,但上半年中国手游在美国收入排行原神吸金1。4亿美元稳居第一IT之家7月28日消息,SensorTower数据显示,2022年上半年,美国移动游戏市场收入达114亿美元(约769。5亿元人民币),是继2020年新冠疫情爆发之后,首次出现较明中国老太太5年花6000万,造了一座千年瓷宫,而自己却住在茅棚里学过英语的人应该都知道,英语单词CHINA的意思是中国,如果CHINA变成小写的话,其意思就成了瓷器。可见瓷器对中国来说,有着特殊的意义,其历史也与中华历史一般源远流长。在江西省景高铁直达!江南深处,藏了一个神仙小县城,山野气息惊艳浙南闽北毗邻雁荡,西接缙云仙都有山皆绿无水不清,美景人间难寻!在浙南大地上这座小城才是最早火爆的山水秘境摄影包子铺BAO青嶂忆遥月,绿萝愁鸣猿早在1600多年前它就是谢灵运眼中的绝美江南更
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网