SQL优化万能公式:5 大步骤 + 10 个案例_第1页
SQL优化万能公式:5 大步骤 + 10 个案例_第2页
SQL优化万能公式:5 大步骤 + 10 个案例_第3页
SQL优化万能公式:5 大步骤 + 10 个案例_第4页
SQL优化万能公式:5 大步骤 + 10 个案例_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SQL优化一般步骤1、通过慢查日志等定位那些执行效率较低的SQL语句2、explain 分析SQL的执行计划需要重点关注type、rows、filtered、extra。type由上至下,效率越来越高ALL 全表扫描index 索引全扫描range 索引范围扫描,常用语,=,between,in等操作ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询null MySQL不访问任何表或索引,直接返回结果 虽

2、然上至下,效率越来越高,但是根据cost模型,假设有两个索引idx1(a, b, c),idx2(a, c),SQL为select * from t where a = 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,会用idx1,否则会用idx2ExtraUsing filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被

3、排序,并按排序顺序检索行。Using temporary:使用了临时表保存中间结果,性能特别差,需要重点优化Using index:表示相应的 select 操作中使用了覆盖索引(Coveing Index),避免访问了表的数据行,效率不错!如果同时出现 using where,意味着无法直接通过索引查找来查询到符合条件的数据。Using index condition:MySQL5.6之后新增的ICP,using index condtion就是使用了ICP(索引下推),在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据。3、show profile 分析了解SQ

4、L执行的线程的状态及消耗的时间。默认是关闭的,开启语句“set profiling = 1;”1SHOWPROFILES;2SHOWPROFILEFORQUERY#id;4、tracetrace分析优化器如何选择执行计划,通过trace文件能够进一步了解为什么优惠券选择A执行计划而不选择B执行计划。1setoptimizer_trace=enabled=on;2setoptimizer_trace_max_mem_size=1000000;3select*frominformation_schema.optimizer_trace;5、确定问题并采用相应的措施优化索引优化SQL语句:修改SQL

5、、IN 查询分段、时间查询分段、基于上一次数据过滤改用其他实现方式:ES、数仓等数据碎片处理场景分析案例1:最左匹配索引1KEYidx_shopid_orderno(shop_id,order_no)SQL语句1select*from_twhereorderno=查询匹配从左往右匹配,要使用order_no走索引,必须查询条件携带shop_id或者索引(shop_id,order_no)调换前后顺序案例2:隐式转换索引1KEYidx_mobile(mobile)SQL语句1select*from_userwheremobile=12345678901隐式转换相当于在索引上做运算,会让索引失效。

6、mobile是字符类型,使用了数字,应该使用字符串匹配,否则MySQL会用到隐式替换,导致索引失效。案例3:大分页索引1KEYidx_a_b_c(a,b,c)SQL语句1select*from_twherea=1andb=2orderbycdesclimit10000,10;对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式, 一种是把上一次的最后一条数据,也即上面的c传过来,然后做“c 2021-01-0100:00:00andorder_status=10范围查询还有“IN、between”案例6:不等于、不包含不能用到索引的快速搜索。(可以用到ICP)1sele

7、ct*from_orderwhereshop_id=1andorder_statusnotin(1,2)2select*from_orderwhereshop_id=1andorder_status!=1在索引上,避免使用NOT、!=、!、NOT EXISTS、NOT IN、NOT LIKE等案例7:优化器选择不使用索引的情况如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),优化器会选择通过聚集索引来查找数据。1select*from_orderwhereorder_status=1查询出所有未支付的订单,一般这种订单是很少的,即使建了索引,也没法使用索引。案例8:复杂查询1selectsum(amt)from_twherea=1andbin(1,2,3)andc2020-01-01;2select*from_twherea=1andbin(1,2,3)andc2020-01-01limit10;如果是统计某些数据,可能改用数仓进行解决;如果是业务上就有那么复杂的查询,可能就不建议继续走SQL了,而是采用其他的方式进行解决,比如使用ES等进行解决。案例9:asc和desc混用1select*from_twherea=1orderbybdesc,casc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论