简述:一条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字段与之共同满足最左前缀原则