慢SQL日志简述
通过命令和查看日志文件的方式直接查看mysql服务器的慢sql
参数配置
参数作用slow_query_log是否启用
slow_query_log_file日志文件
long_query_time慢sql阈值
log_slow_adimin_statements是否记录数据库管理相关的sql
long_queries_not_using_indexes是否记录未使用索引的sql
### 慢日志内容
内容描述
-----------
#Time:2020-09-27T22:27:56.343654Z日志时间
#User@Host:root@huan[127.0.0.1]id:2客户端主机
#Query_time:3.346928 Lock_time:0.000482 Rows_sent:1 Rows_examined:5003427执行时间(s), 锁时间, 返回结果行数, 查询总行数
SET timestamp=1588763242sql执行发生时间
select count(*) from poemsql内容
### 日志分析辅助工具mysqldumpslow
例如:查询最慢的前100条sql
mysqldumpslow -t 100 /var/lib/mysql/slow.log
主要功能是, 统计不同慢sql的
出现次数(Count),
执行最长时间(Time),
累计总耗费时间(Time),
等待锁的时间(Lock),
发送给客户端的行总数(Rows),
扫描的行总数(Rows),
用户以及sql语句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).
索引概述
聚集索引(聚簇索引)
InnoDB表都有一个称为聚集索引的特殊索引(默认主键,没有则是唯一键,都没有则选择隐式的rowid键)
二级索引(非聚簇索引)
所有非聚集索引,都称为二级索引
单列索引
索引只涉及一个列
多列索引(复合索引、联合索引、组合索引)
索引涉及多个列(最多16列)
覆盖索引
它本身不是一种索引,只是查询语句所需要的列被包含在查询条件中的索引里面,直接通过索引查询出结果,不需要回表查询
如:select id from user where id < 100
查询优化器概述
查询优化器的任务是找到执行sql查询的最佳计划,是mysql数据库的一个核心功能模块。根据表、列、索引的详细信息以及sql语句中的条件,多方面来让sql高效的执行。
优化器选择出的执行效率最高的一组操作,称之为查询计划。
查询优化器优化过程:
准备阶段
补全sql(* 转 对应字段)
优化阶段
条件优化(常量传递、等值替换、移除无用条件)
例如:5=5 and a>5 改写为 a>5
(a5 and b=c and a= 5
表依赖关系分析
查看用到的ref所以索引
评估记录扫描数、成本分析
执行计划
id: MySQL Query Optimizer 选定的执行计划中查询的序列号。表示查询中执行 select 子句或操作表的顺序,id值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。
select_type:查询类型,SIMPLE、PRIMARY、UNION、DEPENDENT UNION等。
table:显示这一行的数据是关于哪张表的
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和all
possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从where语句中选择一个合适的语句
key: 实际使用的索引。如果为null,则没有使用索引。很少的情况下,mysql会选择优化不足的索引。这种情况下,可以在select语句中使用
use index(indexname)来强制使用一个索引或者用ignore index(indexname)来强制mysql忽略索引
key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:mysql认为必须检查的用来返回请求数据的行数
extra:关于mysql如何解析查询的额外信息。