一、生成实验数据

原理:sql 蠕虫复制(这种生成数据方式同样适用于数据表中有主键的情况)。

insert into comic (name,pen_name,cover) select name,pen_name,cover from comic

二、慢查询日志设置

当语句执行时间较长时,通过日志的方式进行记录,这种方式就是慢查询的日志。

1、临时开启慢查询日志(如果需要长时间开启,则需要更改mysql配置文件,第6点有介绍)

set global slow_query_log = on;

注:如果想关闭慢查询日志,只需要执行 set global slow_query_log = off; 即可

2、临时设置慢查询时间临界点  查询时间高于这个临界点的都会被记录到慢查询日志中(如果需要长时间开启,则需要更改mysql配置文件,第6点有介绍)。

set long_query_time = 1;

现在起,所有执行时间超过1秒的sql都将被记录到慢查询文件中(我这里就是 /data/mysql/mysql-slow.log)。

3、设置慢查询存储的方式

set globle log_output = file;

说明: 可以看到,我这里设置为了file,就是说我的慢查询日志是通过file体现的,默认是none,我们可以设置为table或者file,如果是table则慢查询信息会保存到mysql库下的slow_log表中

4、查询慢查询日志的开启状态和慢查询日志储存的位置

show variables like '%quer%';

参数说明:

slow_query_log : 是否已经开启慢查询

slow_query_log_file : 慢查询日志文件路径

long_query_time :  超过多少秒的查询就写入日志

log_queries_not_using_indexes 如果值设置为ON,则会记录所有没有利用索引的查询(性能优化时开启此项,平时不要开启)

5、使用慢查询日志示例

cat -n  /data/mysql/mysql-slow.log

从慢查询日志中,我们可以看到每一条查询时间高于1s钟的sql语句,并可以看到执行的时间是多少。

比如上面,就表示 sql语句  select * from comic where comic_id < 1952000;  执行时间为3.902864秒,超出了我们设置的慢查询时间临界点1s,所以被记录下来了。

6、永久设置慢查询日志开启,以及设置慢查询日志时间临界点

linux中,mysql配置文件一般默认在 /etc/my.cnf

更改对应参数即可。

三、对慢查询日志进行分析

我们通过查看慢查询日志可以发现,很乱,数据量大的时候,可能一天会产生几个G的日志,根本没有办法去清晰明了的分析。所以,这里,我们采用工具进行分析。

1、使用mysqldumpslow进行分析第一种方式

mysqldumpslow -t 10  /data/mysql/mysql-slow.log  #显示出慢查询日志中最慢的10条sql

注:mysqldumpslow工具还有其他参数,以提供其他功能,这里,只以最基本的-t做了介绍。

2、使用pt-query-digest工具进行分析

mysqldumpslow是mysql安装后就自带的工具,用于分析慢查询日志,但是pt-query-digest却不是mysql自带的,如果想使用pt-query-digest进行慢查询日志的分析,则需要自己安装pt-query-digest。pt-query-digest工具相较于mysqldumpslow功能多一点。

(1)安装

yum install perl-DBI

yum install perl-DBD-MySQL

yum install perl-Time-HiRes

yum install perl-IO-Socket-SSL

wget percona.com/get/pt-query-digest

chmod u+x pt-query-digest

mv pt-query-digest  /usr/bin/

(2)查看具体参数作用

pt-query-digest --help

(3)使用

pt-query-digest  /data/mysql/mysql-slow.log

查询出来的结果分为三部分

第一部分:

显示出了日志的时间范围,以及总的sql数量和不同的sql数量。

第二部分:

显示出统计信息。

第三部分:

每一个sql具体的分析

pct是percent的简写,表示占的百分比

cout是占总sql个数的百分比,exec time 是占总执行时间的百分比,lock time 表示占总的锁表时间的百分比。

(4)如何通过pt-query-digest 慢查询日志发现有问题的sql

1)查询次数多且每次查询占用时间长的sql

通常为pt-query-digest分析的前几个查询

2)IO消耗大的sql

注意pt-query-digest分析中的Rows examine项

3)为命中索引的sql

注意pt-query-digest分析中Rows examine(扫描行数) 和 Rows sent (发送行数)的对比 ,如果扫描行数远远大于发送行数,则说明索引命中率并不高。

四、对sql进行优化

1、使用explain查询sql的执行计划

explain select comic_id,name,pen_name,cover,last_verify_time from comic;

参数分析:

table:表示属于哪张数据表

type:最重要的参数,表示连接使用了何种类型。从最好到最差的连接类型为const,eq_reg,ref,range,index和ALL。

possible_keys:显示可能应用在这张表中的索引。如果为null,则表示没有可能的索引。

key:实际使用的索引。如果为null,则表示没有使用索引。

key_len:使用的索引的长度,在不损失精确性的情况下,长度越短越好。

ref:表示索引的哪一列被使用了,如果可能的话,是一个常数。

rows:Mysql认为必须检查的用来返回请求数据的行数。

2、count() 和 Max() 的优化方法

(1)优化前,是没有为last_update_time字段建立索引的情况,查询最大的时间戳

(2)优化后,是为last_update_time字段建立索引的情况,查询最大的时间戳

create index update_time on comic(last_update_time);

对比,可以看到,在没有为字段建立索引的情况下,查询时间是11秒多,建立索引之后,查询时间变成0秒了。

所以总结就是,如果经常用于count和max操作的字段,可以为其添加索引。

还有,值得注意的地方是:count() 计算时,count(*)会将这一列中的null值但也算进去,而count(comic_id)则不会将null算进去。

3、子查询的优化

通常情况下,需要把子查询优化为join查询,但在优化时要注意关联键是否有一对多的关系,如果有,是可能会出现重复数据的。所以如果存在一对多关系,则应该使用distinct进行限制。

例如:

select t.id from t where t.id in (select k.kid from k);

优化成:

select distinct t.id from t join k on t.id = k.kid;

4、group by 的优化

#待补

5、limit的优化

五、对索引进行优化

1、选择合适的列建立索引

2、索引优化sql的方法

3、索引维护的方法

六、数据库结构优化

1、选择合适的数据类型

2、数据库表的范式化优化

3、数据库表的反范式优化

4、数据库表的垂直拆分

5、数据库表的水平拆分

七、系统配置优化

1、数据库系统配置优化

2、Mysql配置文件优化

3、第三方配置工具使用

八、服务器硬件优化

Mysql慢查询日志的使用 和 Mysql的优化相关推荐

  1. liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...

    查看 MySQL 是否启用了慢 SQL 查询: 查看慢 SQL 日志是否启用. mysql> show variables like 'log_slow_queries'; +--------- ...

  2. MySQL 慢查询日志分析及可视化结果

    MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...

  3. mysql慢查询日志平时开启吗_MySQL开启慢查询日志功能的方法

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里是否有很耗费资源的sql语句,这是一个有用的日志.它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失 ...

  4. MySQL慢查询日志的配置与使用_MySQL 慢查询日志的开启与配置

    简介 MySQL 慢查询日志是排查问题 SQL 语句,以及检查当前 MySQL 性能的一个重要功能. 查看是否开启慢查询功能: mysql> show variables like 'slow_ ...

  5. 6、MySQL慢查询日志(Slow Query Log)

    慢查询日志用来记录在 MySQL 中执行时间超过指定时间的查询语句.通过慢查询日志,可以查找出哪些查询语句的执行效率低,以便进行优化. 通俗的说,MySQL 慢查询日志是排查问题的 SQL 语句,以及 ...

  6. mysql慢查询日志 Mysql慢查询

    mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?    其实打开mysql的慢查询日志很简单,只需要在mysql ...

  7. mysql 慢查询日志的作用_MySQL慢查询日志的作用和开启

    前言 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中.lon ...

  8. mysql慢查询call_慢查询日志 - Azure Database for MySQL | Microsoft Docs

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. Azure Datab ...

  9. ELK logstash 处理MySQL慢查询日志

    介绍 在生产环境下,logstash 经常会遇到处理多种格式的日志,不同的日志格式,解析方法不同.下面来说说logstash处理多行日志的例子,对MySQL慢查询日志进行分析,这个经常遇到过,网络上疑 ...

最新文章

  1. 获取保存在沙盒中plist文件的用户的字典信息
  2. HTTP请求格式和HTTP响应格式
  3. [GXYCTF2019]CommonModulusAttack
  4. bs4之标签树的上行遍历
  5. drf6 权限和频率控制组件
  6. parkAndCheckInterrupt
  7. Spring Boot 终极清单
  8. MVC中controller有什么作用
  9. mysql导入1366_mysql source导入报错ERROR 1366的解决方法
  10. Don't Make Me Think
  11. 67. 查询分页数据(2)
  12. 从B树、B+树、B*树谈到R树
  13. 申请开通支付宝当面付、电脑网站、手机网站、APP、刷脸支付
  14. 阿甘正传中的人生哲理
  15. 基于java网上体育用品商城系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  16. java的string的intern_java String的intern()方法
  17. Python+OpenCV手势识别Mediapipe(基础篇)
  18. 发现了一个好网站.绝不是打广告,独乐乐不如众乐乐.
  19. 2021-Java面试题(03-29已更新)
  20. 50种快速提升网站流量方法

热门文章

  1. 求Python工程师推荐
  2. xp系统服务器的ip地址怎么查,xp怎么配置ip地址|xp系统怎么样查看自己的ip地址...
  3. Node版本的升级/降级
  4. java long 0_Java中的long类型和Long类型比较大小
  5. 传感器之方向:使用加速度传感器和地磁传感器共同实现
  6. 全面质量管理在软件业的应用
  7. 说话技巧 为人处事
  8. CIO40: 学习.遇见更优秀的自己
  9. 《idea》idea快捷键总结,IntelliJ IDEA快捷键.
  10. 使用Log日志 计算带宽流量峰值