11、定位SQL执行慢

1、数据库服务器的优化步骤

S观察(Show status)和A行动(Action)mysql

  1. 是否存在周期性的波动,加缓存,或者更改缓存失效策略
  2. 开启慢查询,定位执行慢的 SQL 语句
  3. 用 EXPLAIN 查看对应 SQL 语句的执行计划,或者使用 SHOW PROFILE 查看 SQL 中每个步骤的时间成本
  4. SQL 等待时间长,能够调优服务器的参数,好比适当增长数据库缓冲池
  5. SQL 执行时间长,索引设计的问题、查询关联的数据表过多、数据表的字段设计问题致使了这一现象
  6. 增长服务器,采用读写分离的架构,或者考虑对数据库分库分表,好比垂直分库、垂直分表和水平分表

2、使用慢查询定位执行慢的 SQL

show variables like '%slow_query_log'; -- 查看慢查询日志设置
set global slow_query_log='ON'; -- 开启慢查询日志
show variables like '%long_query_time%'; -- 查看慢查询的时间阈值设置
set global long_query_time = 3; -- 设置慢查询时间阈值(秒)

使用 MySQL 自带的 mysqldumpslow 工具统计慢查询日志正则表达式

  • -s:采用 order 排序的方式,分别是 c(访问次数)、t(查询时间)、l(锁定时间)、r(返回记录)、ac(平均查询次数)、al(平均锁定时间)、ar(平均返回记录数)和 at(平均查询时间,默认排序
  • -t:返回前 N 条数据 。
  • -g:后面能够是正则表达式,对大小写不敏感

3、使用 EXPLAIN 查看执行计划

EXPLAIN SELECT 字段 FROM 表 WHERE 条件

  • all 是最坏的状况,由于采用了全表扫描的方式
  • index 和 all 差很少,只不过 index 对索引表进行全扫描,这样作的好处是再也不须要对数据进行排序,可是开销依然很大
  • 若是咱们在 Extral 列中看到 Using index,说明采用了索引覆盖,也就是索引能够覆盖所需的 SELECT 字段,就不须要进行回表,这样就减小了数据查找的开销

4、使用 SHOW PROFILE 查看 SQL 的具体执行成本

show variables like 'profiling'; -- 查看SQL 的执行成本设置
set profiling = 'ON'; -- 开启SQL 的执行成本设置
show profiles; -- 当前会话都有哪些 profiles
show profile; -- 查看上一个查询的开销
相关文章
相关标签/搜索