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

8个提升SQL性能的Tips,每个后端都应该知道

2月2日 颜如初投稿
  作为一名后端程序员,可以说天天都要跟数据库打交道,不管使用的是MySQL,Oracle还是SQLServer,毫无疑问都逃不开SQL,所以日常工作中对于SQL的性能优化可谓说十分重要。今天阿粉就带大家看一下,每个后端程序员都应该知道的十个提升查询性能的技巧。1、使用Exists代替子查询
  子查询在日常的工作中不可避免一定会使用到,很多时候我们的用法都是这样的:SELECTId,NameFROMEmployeeWHEREDeptIdIn(SELECTIdFROMDepartmentWHERENamelikeManagement);
  相信大家平常肯定都是这样来使用的,其实还有一种更好的方法,如下所示:SELECTId,NameFROMEmployeeWHEREDeptIdExist(SELECTIdFROMDepartmentWHERENamelikeManagement);
  这里我们使用exist关键字而不是In关键字,当然如果在数据量不大的时候,两种方式都可以,但是当数据量很大的时候,exist的方式会比in的方式效率高很多。因为Exist函数根据查询结果返回一个布尔值,速度会快很多。2、适当的使用JOIN来代替子查询
  除了上面的exist之外在有些场景我们可以使用JOIN来替换子查询,毕竟子查询的效果是很差的,如下所示:SELECTId,NameFROMEmployeeWHEREDeptIdin(SELECTIdFROMDepartmentWHERENamelikeManagement);
  使用JOIN的方式如下:SELECTEmp。Id,Emp。Name,Dept。DeptNameFROMEmployeeEmpRIGHTJOINDepartmentDeptonEmp。DeptIdDept。IdWHEREDept。DeptNamelikeM3、使用Where替代不必要的Having
  对于where的使用相信大家都很擅长,但是对于Having的使用可能平时用得不多,阿粉这里只能说:用得不多,挺好的!对于Having我们是能不用就不用不到万不得已的时候不要用,说真的阿粉工作这么多年,真没有使用Having的场景。我们先看下面的示例:
  Having的用法SELECTEmp。Id,Emp。Name,Dept。DeptName,Emp。SalaryFROMEmployeeEmpRIGHTJOINDepartmentDeptonEmp。DeptIdDept。IdGROUPBYdept。DeptNameHAVINGEmp。Salary20000;
  Where的用法SELECTEmp。Id,Emp。Name,Dept。DeptName,Emp。SalaryFROMEmployeeEmpRIGHTJOINDepartmentDeptonEmp。DeptIdDept。IdWHEREEmp。Salary20000;
  为什么说Having的性能没有Where高呢?那是因为Where是一种精确的匹配,但是Having是需要配合GroupBy来配合使用,只要涉及到GroupBy自然就效率高不起来了。4、使用精确的字段类型
  有些小伙伴为了系统的可扩展性或者压根就不知道该把数据库字段的类型设置什么,所以就全部使用char或者varchar,总觉得这样更灵活,但是往往这个时候是对系统的最大隐患。
  在使用时间类型的字段的时候,就需要设置成DateTime,不能用在使用标识是否删除的时候就应该使用tinyint,能用varchar的就不要用对于大字段text需要独立出来,这样在查询的时候就不会影响性能;对于能设置成唯一键的就需要设置成唯一键,因为你永远无法避免程序会出现脏数据,要在数据层保证一致性。5、使用批处理代替循环
  在插入数据的时候的,我们可以使用values来批量进行插入,而不是通过循环来进行单条数据的查询,如下所示:不可取For(Inti0;i5;i){INSERINTOTable1(Id,Value)Values(i,Valuei);}推荐INSERTINTOTable1(Id,Value)Values(1,Value1),(2,Value2),(2,Value3),(4,Value4),(5,Value5);
  不过要注意values后面的数量也是有限制的,所以两者可以结合使用,具体的可以根据表字段的多少来决定分多少批来执行。另外这里有一个注意的点,很多系统都会底层做操作日志,而且很多时候可能是SQL级别的,那这个时候就需要注意,记录操作日志的表的字段是有长度限制的,这里整个SQL的长度是不能超过日志字段的长度的。6、使用UNIONALL替代UNION
  在使用联合查询的时候,很多时候我们会使用到UNIONALL或者UNION来联合多个表,进行汇总。那么UNIONALL和UNION的区别是什么呢?这两个的区别是UNIONALL会返回联合后的所有行记录,而UNION是会进行去重后返回。
  比如说我们有两张表teacher和student,里面的数据分别是下面
  这里这两张表当中,存在相同的一条数据,就是(4,马六)这一条数据,我们可以看看使用UNIONALL和UNION的效果
  可以看到第二次的查询结果中已经少了一行,说明我们上面说的UNION会去重的逻辑是存在的,而且去重是全字段都相同的时候才会被去重。7、用精确的字段代替
  另一个比较影响性能的点是使用,很多小伙伴为了省事,在编写查询语句的时候,会使用来代替所有的字段,其实并不是说这种写法有什么问题,只是这种写法有点不可控,使用表示要查询所有字段,当我们的表是一个很简单的表,而且里面的字段都是一些小字段的时候,使用完全是可以的。
  但是如果是对于一些大表特别是有text这种大字段的表,或者是一些敏感数据的表,我们还使用号去查询数据的话,就会有很大的问题了,一方面是有安全隐患,一方面还是增加磁盘,内存和网络的传输,完全得不偿失。8、给必要的字段增加索引
  索引作为数据库里面一个很重要的内容,相比大家都不陌生,给必要的字段加上索引也是很有必要的,除了主键索引,我们还可以添加聚簇索引和唯一索引,关于索引的内容感兴趣的可以去看看我们的这篇文章面试官问我索引为什么这快?我好像解释不清楚了,这里阿粉就不细说了。总结
  后端程序员除了跟服务器打交道之外最多的就是跟数据库打交道了,如何在数据库层面提效也是一个长久的话题,这也是为什么数据库能得到发展的原因,从关系型数据库到NoSQL数据库,从MySQL到ClickHouse,数据库行业也在长久的发展。
投诉 评论 转载

为什么曾经祸害我们的电脑病毒,如今已经消失不见不知道你们第一台电脑是什么时候买的呢?但是不管什么时候买的,几乎所有人都经历过电脑病毒吧。曾经的我就遇到过不少的电脑病毒,那种病毒基本上就是破坏你的电脑系统,让你无法正常开机。……中国国家公园,为孩子们打开了一扇了解自然和国家公园的科普《中国国家公园》是一套足不出户,便可给孩子科普自然与国家公园的精美绘本。《中国国家公园》这套绘本,共分为三册,分别是《大熊猫国家公园》、《三江源国家公园》、《普达措国家公……说实话,他的塌房是我没有想到的娱乐圈每年都有那么几个明星人设崩塌,我们从最初的大吃一惊,到现在的淡定吃瓜,他们功不可没。但是,他的塌房是我没有想到的。明星可以说要金钱有金钱,随随便便日入过万,月入过千……巨幕屏不要万元,小米这款人气太高了一台86英寸的4KHDR高刷巨幕屏电视要多少钱?或许在当前市场中一些一二线品牌该尺寸的电视至少要万元!但红米这台86英寸电视L86R6MAX仅需5999元,可谓是市场中的搅局者……上美团买iPhone,半小时送达,京东遇到了更快的对手借iPhone14东风,美团直捣京东腹地每年新款iPhone上市时都会掀起新一轮狂欢,今年iPhone14发布后,美团带头发起了iPhone14配送大战。现货最快半……中秋吃蟹,别再清蒸啦,推荐好吃的葱姜桂花炒蟹,鲜香肥美超诱人几度秋意来,最是桂花香。作为中国传统的名贵花木,桂花在秋天有着不可替代的意义。每年秋天,吐蕊开花,除了它的芳香,最让人难忘的便是它的味道,桂花入馔、入酒已然成为了秋……总提不起精神感觉浑身乏力还常伴有失眠头晕?小心这得这个病你是否常常有这些感觉?早晨起床后总感觉没睡醒,浑身疲累,白天工作也是毫无效率,整天浑浑噩噩地提不起精神,还常伴有头昏脑涨,甚至出现心悸气短、腰酸腿困、食欲减退的症状,如果有,那……白垩纪时代动植物是如何灭绝的白垩纪是中生代的最后一段。霸王龙和副栉龙生活在白垩纪时期。白垩纪是中生代最后也是最长的一段。它持续了大约7900万年,从大约1。45亿年前侏罗纪时期的小灭绝事件到6……vivo火力不停歇,12G256G骁龙8,7英寸2K大屏手机vivo已经官宣,新旗舰机将首发天玑9200旗舰芯片,具体机型为vivoX90Pro,最近很多人把目光都集中在了这款手机上,相关的配置、外观和发布时间曝光,据说11月22日推出……8个提升SQL性能的Tips,每个后端都应该知道作为一名后端程序员,可以说天天都要跟数据库打交道,不管使用的是MySQL,Oracle还是SQLServer,毫无疑问都逃不开SQL,所以日常工作中对于SQL的性能优化可谓说十……实体经济如此惨淡,怪谁?还记得王健林和马云打的那个一个亿的赌吗?2020年,如果电商在中国零售市场份额占到50,王健林给马云一个亿,如果没有,帽由马云给王健林一个亿,没想到刚过半年,王健林就认输,给没……冷风里各自盼安好每一个承诺,变成音符停留在音乐深处。眼泪不停的幸福涌出。很感动,因为他们都爱的很投入,很投入,因为他们是彼此的全部,就算再辛苦,他们也要不停的付出……
金庸祖籍所在地查济古村冬日游记房地产市场降三高有信心生命无常感恩活着新机vivoS16Pro曝年底发布天玑820080W充电海南省客家商会会员单位走访记实驻守人回家核心岗位员工现场办公,上海基金业按下复工加速键杨过以后相信报复性消费,下周指数回踩后白酒能否突破西行散记(七)拉卜楞寺木鸟民宿新十条发布,平台跨省民宿搜索量上涨超300现在的年轻人为什么喜欢躺平壮志未酬身先死!盘点本届世界杯最让人失望的球队85岁马玉琴下跪求打赏,称吃不起饭,李玉成却炫富月入200万胡萝卜抱枕英雄联盟赏金出装(英雄联盟赏金出装)兰花的养殖方法,花友两年养殖兰花经验分享黄金小神童兰花一年开几次花知名中学进京是否加剧教育不公利落眼妆小技巧教你打造干净眼妆抓蝴蝶非马诗歌《石头记》原文及赏析印度一家计划于2018年登陆月球的初创企业获得了“里程碑”奖如何在孕期看出胎儿性别?松江的烟感怎么编码支付宝蚂蚁庄园小鸡问答成语首当其冲是指冲在最前面吗

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