mysql慢查询分析

Posted 一纸千痕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql慢查询分析相关的知识,希望对你有一定的参考价值。

mysql慢查询分析

什么叫做慢查询,如何可以查到慢查询的记录

顾名思义慢查询就是查询的语句反应时间超过阀值的时间,设置慢查询的全局配置就需要在配置文件my.cnf
  slow_query_log=1: #是否开启慢查询日志,1表示开启,0表示关闭,(默认为关闭)
  slow_query_time=1                # 设置慢查询的阀值,单位为(s)
  slow_query_log_file=/tmp/mysql_slow.log  # 慢查询的相关信息log的路径

解决慢查询的常用方法

  1. 分库分表
  2. 读写分离
  3. 创建索引

索引的数据结构

B+树

特点

1. B+树的层级少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2. B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
3. B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

常见mysql中B+树的层级(3-4层)why?

 InnoDB存储引擎最小的存储单元是(页), 每一页的大小是16k(即16384个字节),每一行数据大概就是1k左右,那么一页就可以存16条数据
  那么在InnoDb中2层的高度的B+树能存多少条数据,我们来分析一下:
  在InnoDB中每个指针为6个字节,一个键值4-8个字节(如:Id为主键 -> bigInt类型是8字节)那么加起来就是14个字节, 那么一页能存16384/14 =1170个指针, 所以2层的B+树能存1170*16=18720条数据
  在InnoDB在B+树高度一般为3层所以1170 * 1170 * 16= 21902400 条数据,能存千万级别的数据

索引的命中原则

创建一个表:id,name,age,gender id为主键,name为普通索引

回表(二次查询)

select * from table where name=zhangsan
--先根据name查询name的B+树,找到对应的id,后根据id到id的B+中查到所有的数据,这个过程叫做回表

索引覆盖

select id,name from table where name=zhangsan
--先根据name到name的B+树上找到紫叶节点,能够找到name,id的值,就不需要回表了,这个过程叫做索引覆盖

最左前缀

id,name,age,gender id为主键,name,age是组合索引

select * from table where name=zhangsan and age=1 (可以)
select * from table where name=zhangsan (可以)
select * from table where age=1 (不可以)
select * from table where age=1 and name=zhangsan (可以)

索引下推

id,name,age,gender id为主键,name,age是组合索引

select * from table where name=zhangsan and age=1
--没有索引下推之前:先根据name去存储引擎中拉取数据,然后在server层中对age的数据过滤
--有了索引下推之后:直接根据name和age的值对存储引擎拉取数据,不需要到server层去数据过滤

sql语句的执行模块

数据查询分析命令 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)

expalin使用详情

以上是关于mysql慢查询分析的主要内容,如果未能解决你的问题,请参考以下文章

mysql慢查询分析

linux下开启mysql慢查询,分析查询语句

MySQL慢查询 - pt-query-digest详解慢查询日志 pt-query-digest 慢日志分析

mysql慢查询分析工具和分析方法

mysqlsla 分析mysql慢查询日志

记一次mysql慢查询日志分析