介绍
慢查询日志记录了所有执行时间超过指定参数(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 的值越大越好