一文讲解Mysql中常见排查追踪方案

1. EXPLAIN 语句

         EXPLAIN 可以显示 MySQL 执行 SQL 查询时的执行计划。通过执行计划,可以了解查询中各个表的访问方式、连接方式、使用的索引等,从而帮助优化查询。

EXPLAIN SELECT * FROM table_name WHERE condition;

输出字段

        • id:查询的执行顺序。

        • select_type:查询类型,例如简单查询、子查询、联合查询等。

        • table:查询涉及的表。

        • type:访问类型,如 ALL(全表扫描)、index(索引扫描)等。

        • possible_keys:查询可能使用的索引。

        • key:实际使用的索引。

        • rows:MySQL 预计扫描的行数。

        • Extra:额外信息,如 Using filesort(文件排序)、Using temporary(使用临时表)等。

        当SQL执行时间长,注意type是不是ALL,没有走索引,以及Extra部份是否存在。尝试优化方向调整索引以及将排序等操作尽可能放代码操作

2. 开启慢查询日志

        启用慢查询日志

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = XXX; 
SET GLOBAL slow_query_log_file = '/path/to/slow_query.log';

        • 分析慢查询日志:可以使用 mysqldumpslow 工具来汇总和分析慢查询日志中的查询。

        适用于不知道哪里SQL执行慢导致Mysql整体查询缓慢,需要定位SQL

3. 使用 SHOW PROFILE

 启用 Profiling

SET profiling = 1;

执行查询并查看 Profile

SELECT * FROM your_table WHERE condition;  -- 执行查询
SHOW PROFILES;  -- 查看查询的 Profile 列表
SHOW PROFILE FOR QUERY query_id;  -- 查看特定查询的详细 Profile

 各个执行阶段的分析通常会包含以下几个关键步骤:

1. starting

  • 描述:初始化查询,包括启动会话、准备查询环境等。
  • 作用:主要是一些前期准备工作,比如权限检查、设置会话变量等。通常不会消耗太多时间。

2. checking permissions

  • 描述:检查用户权限,确保用户有权限执行该查询。
  • 作用:检查用户是否有权限访问涉及的表、视图或其他数据库对象。这一步若消耗时间较长,可能与权限系统或认证系统相关。

3. Opening tables

  • 描述:打开表文件、读取表结构信息等。
  • 作用:MySQL 需要打开相关表并读取表的元数据,以便确定字段、索引等信息。

4. init

  • 描述:初始化查询,比如设置查询的环境和变量。
  • 作用:为查询执行做准备,比如建立查询计划或初始化查询所需的结构。

5. System lock

  • 描述:获取系统锁。
  • 作用:在某些场景中(如并发访问)需要系统锁来保证数据的一致性。

6. optimizing

  • 描述:查询优化阶段。
  • 作用:MySQL 优化器决定如何执行查询,包括选择最佳的索引、表的连接顺序等。复杂查询在这一阶段可能会消耗较多时间。

7. statistics

  • 描述:收集统计信息。
  • 作用:收集表的统计信息,帮助优化器决定执行计划。

8. preparing

  • 描述:准备执行查询。
  • 作用:在执行查询之前准备数据,例如锁定表、进行一些前置操作。

9. executing

  • 描述:执行查询。
  • 作用:开始真正执行查询,比如对于简单的查询,直接访问数据;对于复杂的查询,执行各个子查询或步骤。

10. Sending data

  • 描述:将数据返回给客户端。
  • 作用:如果是查询语句,会读取数据并返回给客户端。对于大量数据的查询,这一阶段可能会消耗较多时间。

11. end

  • 描述:清理阶段。
  • 作用:释放资源、关闭表、清理临时变量。

12. query end

  •  描述:完成查询的最后阶段。
  •  作用:主要处理日志、更新统计数据等操作。

13. closing tables

  • 描述:关闭表。
  • 作用:完成查询后,MySQL 关闭表释放资源。

14. freeing items

  • 描述:释放临时使用的内存。
  • 作用:释放查询过程中使用的内存、清理缓存等。

15. cleaning up

  • 描述:完成所有清理工作。
  • 作用:进行最后的清理操作,确保会话环境干净。

此外可能出现以下阶段

1. sorting for order:

  • 描述:对结果集进行排序以满足 ORDER BY 子句的要求。
  • 作用:通过在内存或磁盘上对数据进行排序,按照指定的排序规则(如 ASC、DESC 等)组织数据。
  • 注意:当排序数据量大于内存时,MySQL 会使用磁盘临时文件进行排序,可能会导致性能下降。

2. sorting for group:

  • 描述:对结果进行排序以便对分组后的数据进行操作。
  • 作用:在 GROUP BY 操作之前对数据进行排序,将相同分组的数据放在一起。
  • 优化建议:可以通过索引覆盖(即在 GROUP BY 字段上建立索引)来优化该阶段。

3. sorting index:

  • 描述:如果查询使用索引进行排序,则这一阶段会通过索引顺序完成排序。
  • 作用:在部分场景中,MySQL 可以直接利用索引顺序来减少排序时间。
  • 注意:索引顺序不需要额外的内存和 CPU 资源来完成排序,从而显著提升查询性能。

Sending Data、Sorting阶段常见耗时,可采用以下方式尝试优化:

  • 索引优化:在 ORDER BY 或 GROUP BY 字段上创建合适的索引,以避免额外的排序。
  • 减少排序字段数量:尽量减少 ORDER BY 或 GROUP BY 中不必要的字段,避免 MySQL 执行多列排序。
  • 减少查询字段数量:尽量在复杂查询中只查询主键,然后通过主键查询相关字段
  • 增加 sort_buffer_size 参数:适当增大 sort_buffer_size 允许 MySQL 在内存中处理更多数据,减少磁盘 I/O 操作。
  • LIMIT 优化:如果查询中包含 LIMIT,MySQL 会仅对满足 LIMIT 的数据进行排序,从而提高效率。

4. 使用第三方工具

有一些第三方工具可以帮助进行 MySQL 执行追踪,例如:

Percona Toolkit:提供了慢查询分析、查询优化等工具。

pt-query-digest:用于分析慢查询日志,帮助找到最耗时的查询。

MySQL Enterprise Monitor:MySQL 官方提供的企业级监控和优化工具。

        

你可能感兴趣的:(mysql,数据库)