Mysql慢查询日志的使用 和 Mysql的优化

一、生成实验数据

原理: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、第三方配置工具使用

 

八、服务器硬件优化

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 12C CDB、PDB常用管理命令

--查看PDB信息&#xff08;在CDB模式下&#xff09; show pdbs --查看所有pdb select name,open_mode from v$pdbs; --v$pdbs为PDB信息视图 select con_id, dbid, guid, name , open_mode from v$pdbs; --切换容器 alter session set containerorcl1 --切换到PDBorcl1容器…

指定时间的月初和月末一天的写法

DateTime dt Convert.ToDateTime("2017-2");DateTime FirstDay new DateTime(dt.Year, dt.Month, 1);//本月初1號DateTime LastDay new DateTime(dt.AddMonths(1).Year, dt.AddMonths(1).Month, 1).AddDays(-1);//下月初1號減一天本月底 转载于:https://www.cnblo…

mysql数据表设计要点以及快门

一个sql表的设计首先要考虑的是字段 然后去考虑这个字段应该具有哪些特性, 最后,考虑哪些字段经常用于查询,设置为索引 下面是一个比较简单的例子,大概说明了怎么样去构造sql语句创建一个sql表 create table user_message( id int UNSIGNED not null auto_increment COMMEN…

分享实录|区块链技术与智能合约入门(开发实例)

1 什么是区块链 1.1白话讲解区块链 现在区块链特别火&#xff0c;可能大家都听说过区块链&#xff0c;听说过比特币&#xff0c;那到底什么是区块链&#xff1f; 前几天和一个朋友撸串&#xff0c;我给他安利区块链和比特币以及一些数字货币的知识&#xff0c;这个朋友也是一个…

大型网站技术架构:核心原理与案例分析笔记

1.大型网站软件系统的特点&#xff1a; 高并发&#xff0c;大流量  高可用 海量数据  用户分布广泛&#xff0c;网络情况复杂  安全环境恶劣  需求快速变更&#xff0c;发布频繁  渐进式发展  2.大型网站演变架构 1)初步应用&#xff1a;数据&#xff08;数据…

1777:文件结构“图”

1777:文件结构“图” 查看提交统计提问总时间限制: 1000ms内存限制: 65536kB描述在计算机上看到文件系统的结构通常很有用。Microsoft Windows上面的"explorer"程序就是这样的一个例子。但是在有图形界面之前&#xff0c;没有图形化的表示方法的&#xff0c;那时候最…

thinkphp出现Call to undefined function Think\C() in ... online 313

造成这个问题的原因很多,在这里我只说明我自己遇到之后解决的办法 我将functions.php改成了function.php之后,修改了一些其他无关紧要的东西出现了这个问题,来回排查,各种尝试,最后,将function.php改回functions.php,可以正常运行

Oracle数据库IP访问限制(IP白名单黑名单)

1、编辑sqlnet.ora内容为&#xff1a;#允许访问的IP&#xff08;白名单&#xff09;TCP.INVITED_NODES(127.0.0.1,192.168.56.109,ip2,ip3,..,..本地IP..)若使用白名单&#xff0c;必须有本地IP&#xff0c;否则监听会起不来#不允许访问的IP&#xff08;黑名单&#xff09;#TCP…

WPF效果第一百九十九篇之Gamma曲线

前面效果中分享了模块对比;今天大周末那就再来分享一下最近实现的效果;基于YX^n公式根据不同的系数绘制Gamma曲线效果如下图:1、曲线的话,咱就用最简单的方式绘制一堆点:PathFigure pathFigure new PathFigure(){StartPoint new Point(0, count),};for(double x 0; x < 1…

图片序列化和反序列化成图片文件(代码)

// // ViewController.m // 图片序列化和反序列化 // // Created by Qlinchao on 17/3/14. // Copyright © 2017年 QLC. All rights reserved. //#import "ViewController.h"interface ViewController () property (weak, nonatomic) IBOutlet UIImageView …

windows 下 MyEclipse 逆向工程生成hiberate 对应配置文件以及 javaBean。

步骤1&#xff1a; 右边工具栏 -> 右击你的项目 -> 选中 MyEclipse -> Project Facets -> install Hibernate Facet -> 选择对应的版本&#xff08;以及一些你想要的配置&#xff09; 步骤2&#xff1a; 导航栏 -> window -》 show View -> Other 。 然…

php加解密

一 对称加密 1.mycyrpt的对称加密: /*** param $key //数据加密密钥 由自己定义,长度有限制 string* param $string //需要进行加解密的字符串 string* param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密)* return string*/ function encryptDecrypt($key, $st…

深入理解Spring Boot数据源与连接池原理

​ Create by ysterfoxmail.com 2018-8-2一&#xff1a;开始 在使用Spring Boot数据源之前&#xff0c;我们一般会导入相关依赖。其中数据源核心依赖就是spring‐boot‐starter‐jdbc 如下 <dependency><groupId>org.springframework.boot</groupId> …

Dapr 集成 Open Policy Agent 实现 接口的访问控制

大型项目中基本都包含有复杂的访问控制策略&#xff0c;特别是在一些多租户场景中&#xff0c;例如Kubernetes中就支持RBAC&#xff0c;ABAC等多种授权类型。Dapr 的 中间件 Open Policy Agent 将Rego/OPA策略应用到传入的Dapr HTTP请求中。Open Policy AgentOpen Policy Agent…

【Java】BigDecimal

一、前言 在使用Java&#xff0c;double 进行运算时&#xff0c;经常出现精度丢失的问题&#xff0c;总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中&#xff0c;通过一个公式校验该值是否大于0&#xff0c;如果大于0我们会做一件事情&#xff0c;小于0我们又处理其他…

PHP获取当前页面URL

//获取页面url function curPageURL() {$pageURL http;if (!empty($_SERVER[HTTPS])) {$pageURL . "s";}$pageURL . "://";if ($_SERVER["SERVER_PORT"] ! "80") {$pageURL . $_SERVER["SERVER_NAME"].":".$_SER…

【招聘(大连)】北森云计算 .NET 专场招聘

为了更好的实现战略布局&#xff0c;逐步形成以三个产品研发中心&#xff08;北京、成都、大连&#xff09;为主&#xff0c;青岛和南京为辅的产品研发团队配置。北森云第三研发中心&#xff08;大连&#xff09;正式成立&#xff0c;目前大连的人选招聘正式开启&#xff0c;欢…

PHP强制下载文件

//有时我们不想让浏览器直接打开文件&#xff0c;如PDF文件&#xff0c;而是要直接下载文件&#xff0c;那么以下函数可以强制下载文件 //函数中使用了application/octet-stream头类型。 function downloads($filename,$dir./) {$filepath $dir.$filename;if (!file_exists($f…

F5基于证书认证的客户端登录

1.生成密钥RSA类型&#xff0c;密码&#xff1a;123456保存为Openssl格式2.上传客户机SecureCRT生成的公钥 Identity.pub到用户home目录下.ssh文件夹中cd .sshmv Identity.pub authorized_keys ##cat .ssh/id_rsa.pub >> ~/.ssh/authorized_keys3.更改F5 ssh配置文件tmsh…

C#多线程编程-必知必会

“发现问题的能力&#xff0c;运用技术解决问题的能力&#xff0c;是一个技术人成长的关键”图片故事&#xff1a;洋姜的花&#xff0c;拍摄于2022年7月23日&#xff0c;地点&#xff1a;北京奥林匹克森林公园 &#xff0c;摄影师&#xff1a;刘先生概要&#xff1a;使用C#发起…