总结mysql服务器查询慢原因

 会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等。这是镜像库上面的情况。

而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题。说到这里,先来看看以前我们的监控做法 
1. 部署zabbix等开源分布式监控系统,获取每天的数据库的io,cpu,连接数 
2. 部署每周性能统计,包含数据增加量,iostat,vmstat,datasize的情况 
3. Mysql slowlog收集,列出top 10

以前以为做了这些监控已经是很完美了,现在部署了mysql节点进程监控之后,才发现很多弊端 
第一种做法的弊端: zabbix太庞大,而且不是在mysql内部做的监控,很多数据不是非常准备,现在一般都是用来查阅历史的数据情况 
第二种做法的弊端:因为是每周只跑一次,很多情况没法发现和报警 
第三种做法的弊端: 当节点的slowlog非常多的时候,top10就变得没意义了,而且很多时候会给出那些是一定要跑的定期任务语句给你。。参考的价值不大 
那么我们怎么来解决和查询这些问题呢

对于排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有得用索引的查询。 
OK,开始找出mysql中执行起来不“爽”的SQL语句吧。

方法一: 这个方法我正在用,呵呵,比较喜欢这种即时性的。

01 Mysql5.0以上的版本可以支持将执行比较慢的SQL语句记录下来。
02 mysql> show variables like 'long%'; 注:这个long_query_time是用来定义慢于多少秒的才算“慢查询”
03 +-----------------+-----------+
04 | Variable_name | Value |
05 +-----------------+-----------+
06 | long_query_time | 10.000000 |
07 +-----------------+-----------+
08 1 row in set (0.00 sec)
09 mysql> set long_query_time=1; 注: 我设置了1, 也就是执行时间超过1秒的都算慢查询。
10 Query OK, 0 rows affected (0.00 sec)
11 mysql> show variables like 'slow%';
12 +---------------------+---------------+
13 | Variable_name | Value |
14 +---------------------+---------------+
15 | slow_launch_time | 2 |
16 | slow_query_log | ON | 注:是否打开日志记录
17 | slow_query_log_file | /tmp/slow.log | 注: 设置到什么位置
18 +---------------------+---------------+
19 3 rows in set (0.00 sec)
20 mysql> set global slow_query_log='ON' 注:打开日志记录
21 一旦slow_query_log变量被设置为ON,mysql会立即开始记录。
22 /etc/my.cnf 里面可以设置上面MYSQL全局变量的初始值。
23 long_query_time=1
24 slow_query_log_file=/tmp/slow.log

方法二:mysqldumpslow命令

01 /path/mysqldumpslow -s c -t 10 /tmp/slow-log
02 这会输出记录次数最多的10条SQL语句,其中:
03 -s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙;
04 -t, 是top n的意思,即为返回前面多少条的数据;
05 -g, 后边可以写一个正则匹配模式,大小写不敏感的;
06 比如
07 /path/mysqldumpslow -s r -t 10 /tmp/slow-log
08 得到返回记录集最多的10个查询。
09 /path/mysqldumpslow -s t -t 10 -g “left join” /tmp/slow-log
10 得到按照时间排序的前10条里面含有左连接的查询语句。

最后总结一下节点监控的好处 
1. 轻量级的监控,而且是实时的,还可以根据实际的情况来定制和修改 
2. 设置了过滤程序,可以对那些一定要跑的语句进行过滤 
3. 及时发现那些没有用索引,或者是不合法的查询,虽然这很耗时去处理那些慢语句,但这样可以避免数据库挂掉,还是值得的 
4. 在数据库出现连接数过多的时候,程序会自动保存当前数据库的processlist,DBA进行原因查找的时候这可是利器
5. 使用mysqlbinlog 来分析的时候,可以得到明确的数据库状态异常的时间段 
有些人会建义我们来做mysql配置文件设置

调节tmp_table_size 的时候发现另外一些参数 
Qcache_queries_in_cache 在缓存中已注册的查询数目 
Qcache_inserts 被加入到缓存中的查询数目 
Qcache_hits 缓存采样数数目 
Qcache_lowmem_prunes 因为缺少内存而被从缓存中删除的查询数目 
Qcache_not_cached 没有被缓存的查询数目 (不能被缓存的,或由于 QUERY_CACHE_TYPE) 
Qcache_free_memory 查询缓存的空闲内存总数 
Qcache_free_blocks 查询缓存中的空闲内存块的数目 
Qcache_total_blocks 查询缓存中的块的总数目 
Qcache_free_memory 可以缓存一些常用的查询,如果是常用的sql会被装载到内存。那样会增加数据库访问速度。

时间: 2024-08-03 06:58:38

总结mysql服务器查询慢原因的相关文章

mysql服务器查询慢原因分析与解决方法

会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等.这是镜像库上面的情况. 而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题.说到这里,先来看看以前我们的监控做法 1. 部署zabbix等开源分布式监控系统,获取每天的数据库的io,cpu,连接数 2. 部署每周性能统计,包含数据增加量,i

mysql服务器查询慢原因分析与解决方法小结_Mysql

会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等.这是镜像库上面的情况. 而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题.说到这里,先来看看以前我们的监控做法 1. 部署zabbix等开源分布式监控系统,获取每天的数据库的io,cpu,连接数 2. 部署每周性能统计,包含数据增加量,i

mysql服务器查询慢原因分析方法

MySQL数据库在查询的时候会出现查询结果很慢,超过1秒,项目中需要找出执行慢的sql进行优化,应该怎么找呢,mysql数据库提供了一个很好的方法,如下: mysql5.0以上的版本可以支持将执行比较慢的SQL语句记录下来. 1.需要使用打开记录查询慢的sql记录日志: 查看慢查询时间 show variables like 'slow%'; 查看设置多久是慢查询 show variables like 'long%'; 修改慢查询时间 set long_query_time=1; 打开慢查询记

服务器-hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到

问题描述 hibernate操作mysql,模糊查询时中文查不到,数字和英文可以查到 用hibernate做模糊查询,页面传递参数也处理了乱码 @Action(value="searchNameByad") public String searchNameByad()throws Exception{ System.out.println("android发送请求获取的参数是:"+buildingname); //解决乱码问题 String bn = new Str

mysql跨服务器查询(java)

问题描述 目前有两个服务器S1,S2S1中有表A,B,C,其中两张表A,B数据记录上百万条S2中有D,E,F,其中F也是上百万条数据,现在要把ABCDEF一起连表查询(性能要求本地服务器访问1毫秒以内)我是该每个数据库各自子查询再在java程序里联合(又该如何分页?),还是写一个跨服务器连表查询?以前没做过这样子的,求大神指教!! 解决方案 解决方案二:最好不要分开查询然后用程序处理,两种方案:1.使用databaseLink跨域查询,比较简单,查询频繁的话效率不高,因为每次都要去查.2.在一个

MySQL服务器内存使用

Every so often people ask me the question how should they estimate memory consumption by MySQL Server in given configuration. What is the formula they could use. 经常有人问我配置MySQL时该如何估算内存的消耗.那么该使用什么公式来计算呢? The reasons to worry about memory usage are quit

LAMP系统性能调优之MySQL服务器调优

如今,开发人员不断地开发和部署使用LAMP(Linux.Apache.MySQL 和 PHP/Perl)架构的应用程序.但是,服务器管理员常常对应用程序本身没有什么控制能力,因为应用程序是别人编写的.本文重点讨论为实现最高效率而对数据库层进行的调优. 关于 MySQL 调优 有3 种方法可以加快 MySQL服务器的运行速度,效率从低到高依次为: 替换有问题的硬件. 对MySQL进程的设置进行调优. 对查询进行优化. 替换有问题的硬件通常是我们的第一考虑,主要原因是数据库会占用大量资源.不过这种解

如何对MySQL服务器进行调优

如今,开发人员不断地开发和部署使用LAMP(Linux?.Apache.MySQL 和 PHP/Perl)架构的应用程序.但是,服务器管理员常常对应用程序本身没有什么控制能力,因为应用程序是别人编写的.本文重点讨论为实现最高效率而对数据库层进行的调优. 有3种方法可以加快MySQL服务器的运行速度,效率从低到高依次为: 替换有问题的硬件.对MySQL进程的设置进行调优.对查询进行优化. 替换有问题的硬件通常是我们的第一考虑,主要原因是数据库会占用大量资源.不过这种解决方案也就仅限于此了.实际上,

MySQL服务器设置max_user_connections防止连接耗尽,以提高可用性

问题简述/现象及原因 一台MySQL服务器上,有多个数据库,由不同用户使用,相互之间没有或很少关联性.典型的实例是虚拟主机,或者有N多个小网站的某些低频企业应用. 这种环境下,难免有部分应用的质量不高: 出现效率极低的慢查询 -> 后续请求大量被locked排队 -> MySQL服务实时连接数达到最大连接数限制  ->  无法建立新连接 so, 所有相关应用全部挂掉 应对方案 为防止上述情况发生,要为MySQL配置max_user_connections参数.该参数作用是设置单个用户最大