前言
在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的 SQL 就是整个系统性能的瓶颈。
提示:以下是本篇文章正文内容,下面案例可供参考
一、sql语句执行顺序
-
FROM(form)
先确定从哪个表中取数据,所以最先执行from tab。存在多表连接,from tab1,tab2。可以对表加别名,方便后面的引用。 -
ON(on)
连接多张表的附加条件
-
JOIN(join)
连接多张表的关键字
-
WHERE(where)
where语句是对条件加以限定,如果没有需要限定的,那就写成where 1=1,表示总为true,无附加条件。 -
GROUP BY(group by)
分组语句,比如按照员工姓名分组,要就行分组的字段,必须出现在select中,否则就会报错 -
聚合函数
常用的聚合函数有max(),min(), count(),sum(),聚合函数的执行在group by之后,having之前。如果在where中写聚合函数,就会出错
-
HAVING(having)
having是和group by配合使用的,用来作条件限定 -
SELECT(select)
选出要查找的字段,如果全选可以select *
-
DISTINCT(distinct)
去除数据中重复内容 -
ORDER BY(order by)
排序语句,**默认为升序(asc)**排列。如果要降序排列,就写成order by [XX] desc。order by语句在最后执行,只有select选出要查找的字段,才能进行排序。 -
LIMIT(limit)
分页关键字
二、sql优化手段
1.explain 分析SQL的执行计划
EXPLAIN是MySQl必不可少的一个分析工具,主要用来测试sql语句的性能及对sql语句的优化,或者说模拟优化器执行SQL语句。在select语句之前增加explain关键字,执行后MySQL就会返回执行计划的信息,而不是执行sql
- 需要重点关注 type、rows、extra。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOSdRjXz-1650004751129)(D:JAVAjavabasic81博客imgimage-20220414112811348.png)]
- type由上至下,效率越来越高
- ALL 全表扫描
- index 索引全扫描
- range 索引范围扫描,常用语<,<=,>=,between,in 等操作
- ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
- eq_ref 类似 ref,区别在于使用的是唯一索引,使用主键的关联查询
- const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
- null MySQL 不访问任何表或索引,直接返回结果
- 虽然上至下,效率越来越高,但是根据 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