了解Mysql(二)

MySQL性能优化之慢查询

慢查询的用途

它能记录下所有执行超过long_query_time时间的SQL语句,帮我们找到执行慢的SQL,方便我们对这些SQL进行优化。

查看是否开启慢查询

show variables like 'slow_query%'

slow_query_log = off,表示没有开启慢查询

slow_query_log_file ,表示慢查询日志存放的目录

开启慢查询(需要的时候才开启,因为很耗性能,建议使用即时性的

方式一:(即时性的,重启mysql之后失效,常用的

set global slow_query_log=1; 或者 set global slow_query_log=ON;

开启之后 我们会发现 /var/lib/mysql下已经存在 localhost-slow.log了,未开启的时候默认是不存在的。

方式二:(永久性的

在/etc/my.cfg文件中的[mysqld]中加入:

 设置慢查询记录的时间

查询慢查询记录的时间:show variables like 'long_query%',默认是10秒钟,意思是大于10秒才算慢查询。

我们现在设置慢查询记录时间为1秒:set long_query_time=1;

执行select count(1) from order o where o.user_id in (select u.id where users);

因为我们开启了慢查询,且设置了超过1秒钟的就为慢查询,此sql执行了24秒,所以属于慢查询。

我们在日志中查看:

more /var/lib/mysql/localhost-slow.log

 

我们可以看到查询的时间,用户,花费的时间,使用的数据库,执行的sql语句等信息。在生产上我们就可以使用这种方式来查看 执行慢的sql。

查询慢查询的次数:show status like 'slow_queries';

在我们重新执行刚刚的查询sql后,查询慢查询的次数会变为8

 慢查询日志分析工具Mysqldumpslow

由于在生产上会有很多慢查询,所以采用上述的方法查看慢查询sql会很麻烦,还好MySQL提供了慢查询日志分析工具Mysqldumpslow。

其功能是, 统计不同慢sql的出现次数(Count),执行最长时间(Time),累计总耗费时间(Time),等待锁的时间(Lock),发送给客户端的行总数(Rows),扫描的行总数(Rows)(1)查询Mysqldumpslow的帮助信息,随便进入一个文件夹下,执行:mysqldumpslow --help

查看mysqldumpslow命令安装在哪个目录:whereis mysqldumpslow

 show profile

用途:用于分析当前会话中语句执行的资源消耗情况

(1)查看是否开启profile,mysql默认是不开启的,因为开启很耗性能

show variables like 'profiling%';

 

(2)开启profile(会话级别的,关闭当前会话就会恢复原来的关闭状态)

set profiling=1; 或者 set profiling=ON;

(3)关闭profile

set profiling=0; 或者 set profiling=OFF;

(4)显示当前执行的语句和时间

show profiles;

 
img

(5)显示当前查询语句执行的时间和系统资源消耗

show profile cpu,block io for query 4;(分析show profiles中query_id等于4的sql所占的CPU资源和IO操作)

或者直接 : show profile for query 4;

 

 MySQL性能分析语句show profile

介绍:Query Profiler是MYSQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的性能瓶颈在什么地方。

           通常我们是使用的explain,以及slow query log都无法做到精确分析,但是Query Profiler却可以定位出一条SQL语句执行的各种资源消耗情况,比如CPU,IO                 等,以及   该SQL执行所耗费的时间等。不过该工具只有在MYSQL 5.0.37以及以上版本中才有实现。

          默认的情况下,MYSQL的该功能没有打开,需要自己手动启动

语句使用

show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情况.

show profiles :以列表形式显示最近发送到服务器上执行的语句的资源使用情况.显示的记录数由变量:profiling_history_size 控制,默认15条

在这里插入图片描述

show profile: 展示最近一条语句执行的详细资源占用信息,默认显示 Status和Duration两列

在这里插入图片描述

show profile 还可根据 show profiles 列表中的 Query_ID ,选择显示某条记录的性能分析信息

在这里插入图片描述

 

开启Profile功能

Profile 功能由MySQL会话变量 : profiling控制,默认是OFF关闭状态

查看是否开启了Profile功能:

 在这里插入图片描述

开启profile功能

 

使用show profile

查看是否打开了性能分析功能

select @@profiling;

 打开 profiling 功能

 set profiling=1;

 

 执行sql语句

 

  执行 show profiles 查看分析列表

 

 查询第二条语句的执行情况

 show profile for query 2;

 

  

  可指定资源类型查询

  show profile cpu,swaps for query 2;

  

  MySQL事务处理

   事务的概念

   事务(Transaction)是一个操作序列,该序列中的多个操作要么都做,要么都不做 是MySQL5.5之后的存储引擎所支持

   事务的特点( 简称 ACID)

   a. 原子性(atomicity)

   原子是自然界中最小的颗粒,具有不可再分的特点,事务中的所有操作可以看作是一个原子(事务是数据库的逻辑工作单位),要么全部执行,要么全不执行.

   b. 一致性(consistency)

   事务执行的结果必须要保证数据库中数据的一致性

   c.隔离性(isolation)

   隔离性指各个事务的操作是互不干扰的,即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

   d.持久性(durability)

   持久性也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响.

   

   事务的控制

   1.创建一个库 test1

   2.创建一张表account(id账号主键唯一,username账号名,balance金额)

   3.插入数据

 

开启事务

语法:start | begin transaction开启一个新的事务

例如:开启新事务,完成张三给李四转账200

 注意:使用start transaction 开启一个新事务后,该事务不会自动提交,必须手动提交。

提交事务

语法:commit

回滚事务

语法:rollback

注意:开启的事务,未提交时候可以回滚。

 

 

原文地址:https://www.cnblogs.com/ptxxc/p/12111537.html