前言
影响查询性能因素
–(定量为同一数据库 且并发 数据量一致)依次是:
- 机器配置
- 查询引擎
- 表设计
- 索引
- SQL语句
什么是慢SQL
比通常执行慢、或者超过最大执行限定时间,通常是500ms
慢SQL危害
每个SQL执行都需要消耗一定I/O资源
SQL执行时间长,用户的体验较差
慢SQL排查定位方法
善用slow log
-- Mysql为例开启slow log :
SET GLOBAL slow_query_log=1;
-- 查看slowlog:
SHOW GLOBAL STATUS LIKE '%Slow_queries%';
善用执行计划
我们往往通过慢查询日志,可以找到慢查询的sql具体是怎么写的。我们往往可以通过表的索引,执行引擎等等去自己判断sql为什么执行缓慢的原因。但是这明显不是高效的。
我们的MySQL中为我们提供了EXPLAN关键字来协助我们分析SQL。
--查看执行计划
explain select * from order_exp;
通过使用 EXPLAIN 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的。分析查询语句或是表结构的性能瓶颈,总的来说通过 EXPLAIN 我们可以帮助我们分析:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用limit
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
Mysql为例,我们根据select_type初步判断查询类型是否是复杂查询,type判断是否走索引,根据possible_keys、key查看具体走的索引,是否是最优索引,根据rows扫描行数是多少?等等我们可以进行直观的参考。
具体说明如下:
字段信息 | 描述解释 |
---|---|
id | 查询的序号,包含一组数字,表示查询中执行select子句或操作表的顺序两种情况id相同,执行顺序从上往下id不同,id值越大,优先级越高,越先执行 |
select_type | 查询类型,主要用于区别普通查询,联合查询,子查询等的复杂查询1、simple ——简单的select查询,查询中不包含子查询或者UNION 2、primary ——查询中若包含任何复杂的子部分,最外层查询被标记3、subquery——在select或where列表中包含了子查询4、derived——在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放到临时表中5、union——如果第二个select出现在UNION之后,则被标记为UNION,如果union包含在from子句的子查询中,外层select被标记为derived6、union result:UNION 的结果 |
type | 显示联结类型,显示查询使用了何种类型,按照从最佳到最坏类型排序1、system:表中仅有一行(=系统表)这是const联结类型的一个特例。2、const:表示通过索引一次就找到 |