MySQL 慢查询日志记录 SQL优化 性能优化 日志查询 Explain

发布于:2024-12-06 ⋅ 阅读:(126) ⋅ 点赞:(0)

介绍

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置针对这些慢查询的SQL语句进行优化。

#开启慢查询开关
slow_query_log=1
#慢查询超时时间
long_query_time=3

是否开启慢查询

SHOW VARIABLES LIKE 'slow_query_log';

在这里插入图片描述

慢日志存储路径

SHOW VARIABLES LIKE 'slow_query_log_file';

Profiles

show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持
profile操作。

是否支持查看详情

SELECT @@have_profiling

默认profiling是关闭的,可以通过set语句在session/global级别开启profiling

开启Profiles

SET profiling =1;

查看每一条SQL耗时

SHOW profiles;

Explain执行计划

它描述了数据库查询处理器如何执行 SQL 查询,包括查询中涉及的各个步骤、操作的顺序、数据访问方式等。通过分析执行计划,开发者和数据库管理员可以理解数据库是如何执行查询的,从而发现潜在的性能瓶颈,优化查询效率。

语法

EXPLAIN SELECT  id,phone,name,sex,password,play_num  FROM user 
WHERE (phone LIKE '%15234204153%') LIMIT 100;

在这里插入图片描述

  • id select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
  • select_type 表示 SELECT的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)
    UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
  • type 表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all 排名越前性能越好
  • possible_key 显示可能应用在这张表上的索引,一个或多个

type连接类型解释

  • NULL 无需访问表中的任何数据(常量查询) 无索引 简单查询
  • system 表只有一行时(系统表) 系统表的唯一索引 系统表查询
  • const 使用主键或唯一索引进行常量查找 主键或唯一索引 精确匹配查询
  • eq_ref 使用唯一索引进行精确匹配(通常用于连接) 唯一索引(主键或唯一索引) 连接查询
  • ref 使用非唯一索引进行查找(通常用于连接) 非唯一索引 非精确匹配连接
  • range 使用索引进行范围扫描(如 BETWEEN、>、<) 索引范围扫描 范围查询
  • index 使用索引进行全索引扫描(覆盖索引) 全索引扫描(覆盖索引) 覆盖索引查询
  • all 全表扫描(最慢的扫描方式) 无索引 无有效索引的查询
  • filtered 表示返回结果的行数占需读取行数的百分比,filtered 的值越大越好