mysql优化案例

今天发现网站页面打开非常慢,对处理过程简单记录了一下

找问题

首先登录服务器使用 top 查看当前进程信息,发现排名第一的是 mysql,占用 cpu 达到了 100% 以上,这就明确了是 mysql 的问题

登录 mysql,使用 show processlist 查看下当前执行状态,发现了大量 LOCK 操作,也有多个 Copying to tmp table 的操作,说明有 sql 出现了问题,操作过于复杂,对临时表使用频繁,把其他操作阻塞了

解决

找到了问题后,把处理方向确定为 检查和修改配置、sql优化

(1)修改mysql配置

临时表

既然涉及了到了临时表,就先查看下目前临时表的信息

查看临时表的使用状态

show global status like 'created_tmp%';

发现 created_tmp_disk_tables 值过高,需要增加此值

再看一下现在临时表的大小

show variables like '%tmp_table_size%';

在现在值的基础上增加一些,重新设置临时表大小

线程缓存数

看当前线程情况

show global status like 'Thread%';

发现 threads_created 的值过大,表明MySQL服务器一直在创建线程

查看当前值

show variables like 'thread_cache_size';

此参数需要调高

打开表数量

查看打开表的情况

show global status like 'open%tables%';

发现 opened_tables 数量过大,说明 table_cache 的值可能太小

查看当前值

show variables like 'table_cache';

此参数需要调高

最大连接数

查看当前允许的最大连接数

show variables like 'max_connections';

查看服务器连接数的峰值

show global status like 'Max_used_connections';

峰值还没到最大限制,不需要修改

join buffer 和 sort buffer

查看现有值

SELECT @@sort_buffer_size;

SELECT @@join_buffer_size;

是默认值,需要修改

修改配置

确定了要修改的参数后,修改 my.cnf ,例如

table_cache = 64 sort_buffer_size = 8M join_buffer_size = 4M thread_cache_size = 300 thread_concurrency = 8 tmp_table_size = 246M

(2)sql优化

从 show processlist 结果集中找出主要的复杂语句,对其进行 explain 和 profile 分析

进行索引优化,把复杂的sql 根据业务拆分为多个小的sql

以上过程完成后,mysql已经恢复正常状态,后期再对其他sql进行优化和缓存处理

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2015-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师之旅

轻松搭建分布式文件系统

用户在登录之后可以上传文件,也可以看到所有上传的文件(自己或其他用户上传的文件),并可以下载这些文件。

27140
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch增删改查 之 —— Delete删除

删除文档也算是常用的操作了...如果把Elasticsearch当做一款普通的数据库,那么删除操作自然就很常用了。如果仅仅是全文检索,可能就不会太常用到删除。...

220100
来自专栏python3

django组件--cookie与session

在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下: 请求银行主页; 

20850
来自专栏我的博客

Ubuntu10.10下安装黄金组合(Apache2+Mysql+php5+phpmyadmin)

1.安装apache sudo apt-get install apache2 需要下载 3,287kB 的软件包。 解压缩后会消耗掉 10.1MB 的额外...

35170
来自专栏pangguoming

Mysql主从配置,实现读写分离

大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的...

15710
来自专栏深度学习之tensorflow实战篇

#!/bin/bash 与#!/bin/sh

hive脚本如下(日表): #!/bin/bash #     /*% ******************************************...

31350
来自专栏java沉淀

解决MySQL ERROR 1130 : Host 'XXXX' is not allowed to connect to this MySQL server

40940
来自专栏python百例

115-fork子进程解析

当使用fork编写多进程的程序时,应该想清楚父子进程的工作各是什么。比如,让父进程生成子进程,子进程做具体的工作。当子进程执行完毕后,需要exit退出。如果不退...

16030
来自专栏前端杂货铺

grunt任务之seajs模块打包

grunt与seajs          grunt是前端流行的自定义任务的脚手架工具,我们可以使用grunt来为我们做一些重复度很高的事情,如压缩,合并,js...

41090
来自专栏Golang语言社区

select多路选择的模拟实现

有时候有这样一种应用场景:需要等待多个事件到达,然后返回尽可能多的事件;如果没有事件到达就阻塞等待。例如服务器等待客户端建立连接,或者等待客户端数据等就有这种应...

33750

扫码关注云+社区

领取腾讯云代金券