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;
(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
注意:开启的事务,未提交时候可以回滚。