mysql优化,肯定要考虑sql语句(sql语句优化不在本文章内说明),优化sql语句,首先要定义慢查询,就是查询速度比较慢的sql,定位记录并分析
如果想知道当前mysql运行的一些状态,当前的mysql连接、并发量、运行时间等
首先进入mysql
show status
看以下图,有400多种,平时常用的我们没有这么多,就那么几种。除非专业的DBA数据库管理员需要知道很多甚至全部
注意一点:show status 中间是有参数的 是:show [session|global] status 即:show session status或者show global status
举例:有些小伙伴在使用的时候明明有一次insert的语句,为什么再次打开窗口查看insert次数的时候总是不对,那是因为用的是session级别
区别请看下文
session和global的区别:
如果只是show status 默认是session级别,即会话级别,就是当前窗口,关闭窗口之后再查询不会记录之前窗口的操作记录
如果是 show global status 即所有,就是从mysql启动之后的所有操作记录都会记录
以下操作我都是以session为例。有兴趣的小伙伴可以尝试global
1. show status like "uptime"; 查询当前mysql使用了多长时间
可以看到已经使用了121579秒,接近34小时
2.show status like "com_select"; 查看使用了多少次查询、删除、修改、添加等,可以根据这些次数选择mysql存储引擎等
如果要看删除、添加等,将select 改为delete、insert.如:show status like "com_insert";
只举其中一个例子:
可以看到,一次添加sql操作都没有
3.show status like "connections"; 查看mysql使用连接数,这里的连接数是指多少个客户端在连接mysql,比如打开5个mysql窗口或者有5个应用程序在连接着mysql,结果就是5
有8个连接,包含我自己本地打开窗口占其中一个
4.netstat -an; 查看当前那些机器连接着mysql。linux操作系统也有此命令,这个命令不是在mysql里面运行,普通cmd命令窗口运行,一般这个命令的结果很多很多,比如oracle(默认端口1521)
框出来的就是连接着oracle的,mysql同理,前面是ip地址,后面是端口,可以看到都是我本机连接着的,但是连接也需要端口,使用的本机的64379等端口,如果不需要可以直接杀掉,linux可以使用kill命令
本文重点:
● show status like "slow_queries";查询慢查询的次数,有多少次慢查询(mysql默认情况下10秒以上为慢查询,一般数据量庞大的时候才会出现)
一次慢查询都没有
如何定位慢查询?
show variables like "long_query_time"; 查看慢查询时间
10秒
set long_query_time=1 修改mysql慢查询(根据自己需要设定)
设置为1秒
先来构建一张大数据量的大表(会用到一些存储过程)
sql地址:https://pan.baidu.com/s/1RzO7sLoF48pFBZOstv6slA 提取码:n7br
创建一张部门表:
创建雇员表:
创建工资级别表并添加5个级别:
定义一个执行命令结束符,是为了存储过程顺利执行
delimiter $$
delimiter关键字,定义一个结束符,我定义成$$,现在的$$就相当于之前的sql语句;的结束符
创建一个函数rand_string(如果不需要了删除它 drop function rand_string $$ 其他函数一样的操作方式)
如果在创建函数出现错误:Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
执行以下命令:
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;
show variables like 'log_bin_trust_function_creators';
具体原因自行百度、google
将结束符修改回来delimiter ; 执行函数 select rand_string(6);
再创建创建一个函数,同样将结束符修改为$$
delimiter $$
同样修改回来结束符;执行函数 delimiter ;
同样的操作再执行几个函数这里就不再截图,提供的sql文件里面有,按照上面操作反复执行就行了,把函数执行完,就完成了大表的数据量(如果有现成的数据就更好,我这里是安装的新的mysql,目前也没有比较大量的数据),以上的函数表是为了方便验证慢查询用
如果超过之前设置的1秒就会被记录慢查询
如何开启慢查询?
mysql默认情况下不记录慢查询日志,需要在启动mysql时指定记录慢查询才会记录
可以在my.ini配置文件直接设定:
[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1
或者在mysql直接设置 set global slow_query_log='ON';
先关闭mysql,再启动, 如果启用了慢查询日志,默认把这个文件放在my.ini 配置文件配置的地址
#Path to the database root
datadir="C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/"
也可以mysql设置 set global slow_query_log_file='/usr/local/mysql/data/slow.log';日志文件可以自定义的,这个地址可以更改
进入这个文件就可以看到mysql慢查询记录的SQL语句