慢查询

作者: 策马踏清风 | 来源:发表于2020-08-05 21:13 被阅读0次

定义及作用

配置

  1. 位置
  • windows下配置文件为my.ini
  • linux下配置文件位置为my.cnf
  1. 开启配置
slow_query_log = 1 # 0关闭 1开启
slow_query_log_file = slow.log # 慢文件存放位置(安装目录date文件夹下)
long_query_time = 5 # 查询多久以上的算是慢

排查

Query_time: xxx # 执行时间
Lock_time: xxx # 锁定时间

分析工具

  • mysqldumpslow
    MySQL自带的慢查询文件解析工具,自带分析。位于bin下。
mysqldumpslow -s at -t 5 /usr/local/data/slow.log
-s at # 算出平均时间
-t 5 # top5

常见优化

  1. 系统层面入手(排查sql导致cpu占用过高)
top -H # 查出性能占用最大的pid
  1. mysql参数优化
# 独立表空间
Using filesort

# 设置缓存空间(连表之类的操作使用的缓存空间)
set sort_buffer_size = 256*1024*1024
  1. sql优化
  • 子查询变成关联查询
  1. 反范式设计优化
  • 针对范式化设计而言
  • 为了性能和读取效率考虑,适当对数据库设计范式进行违反
  • 允许适当冗余,以空间换时间(减少连表)
  1. 索引优化
  • explain查看索引使用情况
  • 根据使用情况重写建立索引(创建时范围索引放最后)

执行计划

explain sql
  • key 是否使用了索引,使用了什么索引
  • key_len 是否充分使用了索引

varchar(50)的索引计算

  1. 字符类型 varchar +2 char+0
  2. 字符集 utf8(3) 一个字符的长度
  3. 本身长度 50
  4. 是否null null(+ 1) not null(+ 0)
50 * 3
varchar(50) * 一个字符3个字节 + 0(not null) + 2(varchar类型)

可以通过索引长度计算出使用了几个索引

Explain字段详解

mysql> explain select * from servers;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | servers | ALL  | NULL          | NULL | NULL    | NULL |    1 | NULL  |
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
row in set (0.03 sec)

1. id

  • 执行顺序的标识,id大的优先执行

2. select_type

  • SIMPLE简单的查询,不使用UNION或子查询等
  • PRIMARY查询中包含任何复杂字部分,最外层查询会被标记为PRIMARY
  • UNION中的后一个语句标记为UNION
  • DEPENDENT UNIONUNION中的后一个语句,取决于外面的查询
  • UNION RESULTUNION语句的结果
  • SUBQUERY子查询中的第一个SELECT
  • DEPENDENT SUBQUERY,子查询中的第一个SELECT,取决于外面的查询
  • DERIVED派生表的SELECTFROM子句的子查询
  • UNCACHEABLE SUBQUERY一个子查询的结果不能被缓存,必须重新评估外链接的第一行

3. table

  • 这一行的数据是关于那张表的,可能是tableNamexx代表执行的步骤

4. type

  • 表示查找到这一行的方式,性能从低到高
  1. ALL遍历全表找到匹配的行
  2. index遍历全部索引树找到匹配的行
  3. range只检索给定范围的行,使用一个索引来选择行
  4. ref表的连接匹配条件,即那些列或常量被用于查找索引上的值
  5. eq_ref类似ref区别在于是使用的所有是唯一索引,即多表中使用primary key或者unique key作为关联条件
  6. constsystem,当MySQL对查询某部分进行优化,并转换成一个常量时,使用这些类型访问。例如主键置于where中,MySQL就能把改查询转换成一个常量,systemconst的特例,当查询的表只有一行情况下是system
  7. NULL执行时不用访问表或索引,例如从索引列选取最小值,可以直接通过索引查找完成。

5. possible_keys

  • 指出MySQL能使用那个索引在表中找到记录,查询涉及到的字段若存在索引,则索引会被列出,但不一定会被利用到。

6.key

  • MySQL决定使用的键

7. key_len

  • 表示索引中使用的字节数,可通过改列计算查询中使用的索引的长度。

8. ref

  • 列与索引的比较,表示上述表的连接匹配条件,即那些列或常量被用于查找索引列的值

9. rows

  • 估算出结果集行数,表示MySQL根据表统计信息及索引选用情况估算找到所需记录所需要读的行数

10. Extra

  • 包含MySQL解决查询的详细信息
  1. Using where,不用读取表中的所有信息,通过索引就能获取所需数据

相关文章

网友评论

      本文标题:慢查询

      本文链接:https://www.haomeiwen.com/subject/wfnorktx.html