当前位置: 首页 > news >正文

app模板大全windows优化大师好不好

app模板大全,windows优化大师好不好,郑州高端定制网站建设,建湖网站建设价格sql优化是一个大家都比较关注的热门话题#xff0c;无论你在面试#xff0c;还是工作中#xff0c;都很有可能会遇到。如果某天你负责的某个线上接口#xff0c;出现了性能问题#xff0c;需要做优化。那么你首先想到的很有可能是优化sql语句#xff0c;因为它的改造成本…sql优化是一个大家都比较关注的热门话题无论你在面试还是工作中都很有可能会遇到。如果某天你负责的某个线上接口出现了性能问题需要做优化。那么你首先想到的很有可能是优化sql语句因为它的改造成本相对于代码来说也要小得多。那么如何优化sql语句呢这篇文章从15个方面分享了sql优化的一些小技巧希望对你有所帮助。1 避免使用select *很多时候我们写sql语句时为了方便喜欢直接使用select *一次性查出表中所有列的数据。反例select * from user where id1;在实际业务场景中可能我们真正需要使用的只有其中一两列。查了很多数据但是不用白白浪费了数据库资源比如内存或者cpu。此外多查出来的数据通过网络IO传输的过程中也会增加数据传输的时间。还有一个最重要的问题是select *不会走覆盖索引会出现大量的回表操作而从导致查询sql的性能很低。那么如何优化呢正例select name,age from user where id1;sql语句查询时只查需要用到的列多余的列根本无需查出来。2 用union all代替union我们都知道sql语句使用union关键字后可以获取排重后的数据。而如果使用union all关键字可以获取所有数据包含重复的数据。反例(select * from user where id1)  union  (select * from user where id2);排重的过程需要遍历、排序和比较它更耗时更消耗cpu资源。所以如果能用union all的时候尽量不用union。正例(select * from user where id1)  union all (select * from user where id2);除非是有些特殊的场景比如union all之后结果集中出现了重复数据而业务场景中是不允许产生重复数据的这时可以使用union。3 小表驱动大表小表驱动大表也就是说用小表的数据集驱动大表的数据集。假如有order和user两张表其中order表有10000条数据而user表有100条数据。这时如果想查一下所有有效的用户下过的订单列表。可以使用in关键字实现select * from order where user_id in (select id from user where status1)也可以使用exists关键字实现select * from order where exists (select 1 from user where order.user_id  user.id and status1)前面提到的这种业务场景使用in关键字去实现业务需求更加合适。为什么呢因为如果sql语句中包含了in关键字则它会优先执行in里面的子查询语句然后再执行in外面的语句。如果in里面的数据量很少作为条件查询速度更快。而如果sql语句中包含了exists关键字它优先执行exists左边的语句即主查询语句。然后把它作为条件去跟右边的语句匹配。如果匹配上则可以查询出数据。如果匹配不上数据就被过滤掉了。这个需求中order表有10000条数据而user表有100条数据。order表是大表user表是小表。如果order表在左边则用in关键字性能更好。总结一下in 适用于左边大表右边小表。exists 适用于左边小表右边大表。不管是用in还是exists关键字其核心思想都是用小表驱动大表。4 批量操作如果你有一批数据经过业务处理之后需要插入数据该怎么办反例for(Order order: list){orderMapper.insert(order): }在循环中逐条插入数据。insert into order(id,code,user_id)  values(123,001,100);该操作需要多次请求数据库才能完成这批数据的插入。但众所周知我们在代码中每次远程请求数据库是会消耗一定性能的。而如果我们的代码需要请求多次数据库才能完成本次业务功能势必会消耗更多的性能。那么如何优化呢正例orderMapper.insertBatch(list):提供一个批量插入数据的方法。insert into order(id,code,user_id)  values(123,001,100),(124,002,100),(125,003,101);这样只需要远程请求一次数据库sql性能会得到提升数据量越多提升越大。但需要注意的是不建议一次批量操作太多的数据如果数据太多数据库响应也会很慢。批量操作需要把握一个度建议每批数据尽量控制在500以内。如果数据多于500则分多批次处理。5 多用limit有时候我们需要查询某些数据中的第一条比如查询某个用户下的第一个订单想看看他第一次的首单时间。反例select id, create_date from order  where user_id123  order by create_date asc;根据用户id查询订单按下单时间排序先查出该用户所有的订单数据得到一个订单集合。然后在代码中获取第一个元素的数据即首单的数据就能获取首单时间。ListOrder list  orderMapper.getOrderList(); Order order  list.get(0);虽说这种做法在功能上没有问题但它的效率非常不高需要先查询出所有的数据有点浪费资源。那么如何优化呢正例select id, create_date from order  where user_id123  order by create_date asc  limit 1;使用limit 1只返回该用户下单时间最小的那一条数据即可。此外在删除或者修改数据时为了防止误操作导致删除或修改了不相干的数据也可以在sql语句最后加上limit。例如update order set status0,edit_timenow(3)  where id100 and id200 limit 100;这样即使误操作比如把id搞错了也不会对太多的数据造成影响。6 in中值太多对于批量查询接口我们通常会使用in关键字过滤出数据。比如想通过指定的一些id批量查询出用户信息。sql语句如下select id,name from category where id in (1,2,3...100000000);如果我们不做任何限制该查询语句一次性可能会查询出非常多的数据很容易导致接口超时。这时该怎么办呢select id,name from category where id in (1,2,3...100) limit 500;可以在sql中对数据用limit做限制。不过我们更多的是要在业务代码中加限制伪代码如下public ListCategory getCategory(ListLong ids) {if(CollectionUtils.isEmpty(ids)) {return null;}if(ids.size()  500) {throw new BusinessException(一次最多允许查询500条记录)}return mapper.getCategoryList(ids); }还有一个方案就是如果ids超过500条记录可以分批用多线程去查询数据。每批只查500条记录最后把查询到的数据汇总到一起返回。不过这只是一个临时方案不适合于ids实在太多的场景。因为ids太多即使能快速查出数据但如果返回的数据量太大了网络传输也是非常消耗性能的接口性能始终好不到哪里去。7 增量查询有时候我们需要通过远程接口查询数据然后同步到另外一个数据库。反例select * from user;如果直接获取所有的数据然后同步过去。这样虽说非常方便但是带来了一个非常大的问题就是如果数据很多的话查询性能会非常差。这时该怎么办呢正例select * from user  where id#{lastId} and create_time  #{lastCreateTime}  limit 100;按id和时间升序每次只同步一批数据这一批数据只有100条记录。每次同步完成之后保存这100条数据中最大的id和时间给同步下一批数据的时候用。通过这种增量查询的方式能够提升单次查询的效率。8 高效的分页有时候列表页在查询数据时为了避免一次性返回过多的数据影响接口性能我们一般会对查询接口做分页处理。在mysql中分页一般用的limit关键字select id,name,age  from user limit 10,20;如果表中数据量少用limit关键字做分页没啥问题。但如果表中数据量很多用它就会出现性能问题。比如现在分页参数变成了select id,name,age  from user limit 1000000,20;mysql会查到1000020条数据然后丢弃前面的1000000条只查后面的20条数据这个是非常浪费资源的。那么这种海量数据该怎么分页呢优化sqlselect id,name,age  from user where id  1000000 limit 20;先找到上次分页最大的id然后利用id上的索引查询。不过该方案要求id是连续的并且有序的。还能使用between优化分页。select id,name,age  from user where id between 1000000 and 1000020;需要注意的是between要在唯一索引上分页不然会出现每页大小不一致的问题。9 用连接查询代替子查询mysql中如果需要从两张以上的表中查询出数据的话一般有两种实现方式子查询 和 连接查询。子查询的例子如下select * from order where user_id in (select id from user where status1)子查询语句可以通过in关键字实现一个查询语句的条件落在另一个select语句的查询结果中。程序先运行在嵌套在最内层的语句再运行外层的语句。子查询语句的优点是简单结构化如果涉及的表数量不多的话。但缺点是mysql执行子查询时需要创建临时表查询完毕后需要再删除这些临时表有一些额外的性能消耗。这时可以改成连接查询。具体例子如下select o.* from order o inner join user u on o.user_id  u.id where u.status110 join的表不宜过多根据阿里巴巴开发者手册的规定join表的数量不应该超过3个。反例select a.name,b.name.c.name,d.name from a  inner join b on a.id  b.a_id inner join c on c.b_id  b.id inner join d on d.c_id  c.id inner join e on e.d_id  d.id inner join f on f.e_id  e.id inner join g on g.f_id  f.id如果join太多mysql在选择索引的时候会非常复杂很容易选错索引。并且如果没有命中中nested loop join 就是分别从两个表读一行数据进行两两对比复杂度是 n^2。所以我们应该尽量控制join表的数量。正例select a.name,b.name.c.name,a.d_name  from a  inner join b on a.id  b.a_id inner join c on c.b_id  b.id如果实现业务场景中需要查询出另外几张表中的数据可以在a、b、c表中冗余专门的字段比如在表a中冗余d_name字段保存需要查询出的数据。不过我之前也见过有些ERP系统并发量不大但业务比较复杂需要join十几张表才能查询出数据。所以join表的数量要根据系统的实际情况决定不能一概而论尽量越少越好。11 join时要注意我们在涉及到多张表联合查询的时候一般会使用join关键字。而join使用最多的是left join和inner join。left join求两个表的交集外加左表剩下的数据。inner join求两个表交集的数据。使用inner join的示例如下select o.id,o.code,u.name  from order o  inner join user u on o.user_id  u.id where u.status1;如果两张表使用inner join关联mysql会自动选择两张表中的小表去驱动大表所以性能上不会有太大的问题。使用left join的示例如下select o.id,o.code,u.name  from order o  left join user u on o.user_id  u.id where u.status1;如果两张表使用left join关联mysql会默认用left join关键字左边的表去驱动它右边的表。如果左边的表数据很多时就会出现性能问题。要特别注意的是在用left join关联查询时左边要用小表右边可以用大表。如果能用inner join的地方尽量少用left join。12 控制索引的数量众所周知索引能够显著的提升查询sql的性能但索引数量并非越多越好。因为表中新增数据时需要同时为它创建索引而索引是需要额外的存储空间的而且还会有一定的性能消耗。阿里巴巴的开发者手册中规定单表的索引数量应该尽量控制在5个以内并且单个索引中的字段数不超过5个。mysql使用的B树的结构来保存索引的在insert、update和delete操作时需要更新B树索引。如果索引过多会消耗很多额外的性能。那么问题来了如果表中的索引太多超过了5个该怎么办这个问题要辩证的看如果你的系统并发量不高表中的数据量也不多其实超过5个也可以只要不要超过太多就行。但对于一些高并发的系统请务必遵守单表索引数量不要超过5的限制。那么高并发系统如何优化索引数量能够建联合索引就别建单个索引可以删除无用的单个索引。将部分查询功能迁移到其他类型的数据库中比如Elastic Seach、HBase等在业务表中只需要建几个关键索引即可。13 选择合理的字段类型char表示固定字符串类型该类型的字段存储空间的固定的会浪费存储空间。alter table order  add column code char(20) NOT NULL;varchar表示变长字符串类型该类型的字段存储空间会根据实际数据的长度调整不会浪费存储空间。alter table order  add column code varchar(20) NOT NULL;如果是长度固定的字段比如用户手机号一般都是11位的可以定义成char类型长度是11字节。但如果是企业名称字段假如定义成char类型就有问题了。如果长度定义得太长比如定义成了200字节而实际企业长度只有50字节则会浪费150字节的存储空间。如果长度定义得太短比如定义成了50字节但实际企业名称有100字节就会存储不下而抛出异常。所以建议将企业名称改成varchar类型变长字段存储空间小可以节省存储空间而且对于查询来说在一个相对较小的字段内搜索效率显然要高些。我们在选择字段类型时应该遵循这样的原则能用数字类型就不用字符串因为字符的处理往往比数字要慢。尽可能使用小的类型比如用bit存布尔值用tinyint存枚举值等。长度固定的字符串字段用char类型。长度可变的字符串字段用varchar类型。金额字段用decimal避免精度丢失问题。还有很多原则这里就不一一列举了。14 提升group by的效率我们有很多业务场景需要使用group by关键字它主要的功能是去重和分组。通常它会跟having一起配合使用表示分组后再根据一定的条件过滤数据。反例select user_id,user_name from order group by user_id having user_id  200;这种写法性能不好它先把所有的订单根据用户id分组之后再去过滤用户id大于等于200的用户。分组是一个相对耗时的操作为什么我们不先缩小数据的范围之后再分组呢正例select user_id,user_name from order where user_id  200 group by user_id使用where条件在分组前就把多余的数据过滤掉了这样分组时效率就会更高一些。其实这是一种思路不仅限于group by的优化。我们的sql语句在做一些耗时的操作之前应尽可能缩小数据范围这样能提升sql整体的性能。15 索引优化sql优化当中有一个非常重要的内容就是索引优化。很多时候sql语句走了索引和没有走索引执行效率差别很大。所以索引优化被作为sql优化的首选。索引优化的第一步是检查sql语句有没有走索引。那么如何查看sql走了索引没可以使用explain命令查看mysql的执行计划。例如explain select * from order where code002;结果通过这几列可以判断索引使用情况执行计划包含列的含义如下图所示如果你想进一步了解explain的详细用法可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑你真的会用吗》说实话sql语句没有走索引排除没有建索引之外最大的可能性是索引失效了。下面说说索引失效的常见原因如果不是上面的这些原因则需要再进一步排查一下其他原因。此外你有没有遇到过这样一种情况明明是同一条sql只有入参不同而已。有的时候走的索引a有的时候却走的索引b没错有时候mysql会选错索引。必要时可以使用force index来强制查询sql走某个索引。至于为什么mysql会选错索引后面有专门的文章介绍的这里先留点悬念。最后说一句(求关注别白嫖我)如果这篇文章对您有所帮助或者有所启发的话帮忙扫描下方二维码关注一下您的支持是我坚持写作最大的动力。求一键三连点赞、转发、在看。
http://www.zqtcl.cn/news/859304/

相关文章:

  • 哈尔滨优化网站方法网站栏目功能分析
  • diy定制网站wordpress 做表格
  • 怎么建设个网站佛山网站设计
  • 饰品企业网站建设做网站管理系统
  • 网站制作的关键技术网站开发网页设计北京师范大学出版社
  • 南宁北京网站建设网站代理合作
  • 网站备案要多少钱包装设计接单网站
  • 涵江网站建设超市营销型网站建设策划书
  • 无锡定制网站建设织梦笑话网站
  • 网站开发的安全性原则潍坊 logo设计公司
  • 宜春市城乡规划建设局网站网站设计师联盟
  • 重庆施工员证查询网站广告设计专业认知报告
  • 网站建设费用要多少黑糖不苦还做网站么
  • 公司网站改版 目的好知网做网站
  • 华强北手机网站建设哈尔滨网站建设oeminc
  • 公司简介网站模板新浪云存储 wordpress
  • 阿里云个人网站建设威海建设集团网站
  • 湖南城乡住房建设厅网站中石化网站群建设
  • 网站关键词怎么做排名大连网站建设方案案例
  • 西安做网站上海建设资质审批网站
  • 平阳高端网站建设广州凡科公司是外包吗
  • 购物网站项目经验公司的八个主要部门
  • 绿色大气网站模板株洲58同城网站建设电话
  • 网站建设 总体思路福州建设高端网站
  • 做网站需要什么配置北京工信部网站备案查询
  • 奇信建设集团官方网站专题网站建站
  • 站点推广策略包括黄山旅游必去十大景点
  • 佛山龙江做网站的信宜做网站
  • 推广自己的网站需要怎么做wordpress 正计时
  • 做网站工资怎么样织梦的官方网站