mysql中sql语句的优化

本文详细介绍了SQL语句的执行过程,包括创建数据库连接、查询缓存、词法和语法分析以及优化器和执行器的角色。讨论了SQL优化的关键点,如连接优化,建议在连接字段上添加索引以提高性能。对于分组和排序,添加索引能有效提升效率,同时提到了单路排序和双路排序的概念。文章还强调了合理使用索引和遵循最左前缀原则在优化中的重要性。
摘要由CSDN通过智能技术生成

简述:一条sql语句是如何执行的,我们常用的分组、排序、连接等sql语句是如何优化的,本文主要分析总结sql优化的原则方法。

sql的优化,不仅仅指的是sql语句的优化,我们想要对sql的优化有全局的了解,需要对sql的执行过程有个全面的了解。

sql的执行过程

在这里插入图片描述
在sql执行之前需要创建与数据库的链接,在项目使用中使用druid数据库连接池存放数据库的连接,创建连接后,如果开启的缓存,首先会查询缓存,如果缓存中没有就会执行sql语句,在执行sql语句前,进行sql语句的词法分析(即识别sql语句中的关键词),识别完成后进行根据一定的语法规则分析sql是否符合语法规则,这一步叫做语法分析,最终会生成语法树。
分析器执行完后,优化器就要登场了,例如索引的选择、根据执行的成本选择执行的方案,确定执行方案后执行器调用存储引擎中接口获取数据然后返回给客户端。

sql语句的优化

前面分析了sql语句的执行过程,可以从优化器、数据存储的结构的角度来优化sql语句,换句话说合理的使用索引能够提高查询的效率,我们根据几种情况分析具体的优化方式

连接的优化

使用join连接查询的sql语句,连接字段需要添加索引,添加索引会使用NLJ算法,没有添加索引会使用BNL算法,在没有添加索引的情况下使用BNL算法效率要比NLJ高很多
在这里插入图片描述

优化方式: 多表连接的字段添加索引 对于inner join方式的多表联查,如果明确哪个是小表可以使用straight
for(左边为驱动表),减少优化器选择的时间

分组、排序的优化

分组相对于排序多了分组的过程,需要排好序后在进行分组,因此两者的优化采用相同的方式,就是在分组/排序字段上添加索引
如果使用explan执行计划查看extra字段,显示using filesort表示没有使用索引排序。
例如:select * from t_order where user_id =1 order by user_id;在这里插入图片描述
当查询条件能够使用覆盖索引,使用的是索引的排序
select id,user_id from t_order where user_id =1 order by user_id;
在这里插入图片描述
文件排序分为:单路排序、双路排序(需要回表查询再返回),使用哪种排序方式取决于max_length_for_sort_data的大小(默认1M),如果查询的数据小于1M,则使用单路排序,反之使用双路排序。

优化方式: 存在多个排序字段时,满足联合索引的最左前缀原则
存在where条件时,order字段与之共同满足最左前缀原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值