前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql性能优化——慢查询分析

Mysql性能优化——慢查询分析

作者头像
L宝宝聊IT
发布2018-08-16 10:36:04
1.2K0
发布2018-08-16 10:36:04
举报
文章被收录于专栏:L宝宝聊ITL宝宝聊IT

MYSQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候瓶颈就会出现在网络上,我们可以用mpstat, iostat,sar和 vmstat来查看系统的性能状态。

除了服务器硬件的性能瓶颈,对于Mysql系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用 EXPLAIN分析查询以及调整MYSQL的内部配置。

一、查询与索引优化分析

在优化mysql时,通常需要对数据库进行分析,常见的分析手段有慢查询日志, EXPLAIN分析查询, profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

性能瓶颈定位

1、show命令

通过show命令查看mysql状态及变量,找到系统的瓶颈,

Mysql > show variables; 查看mysql服务器配置信息

Mysql > show global status; 查看mysql服务器运行的各种状态值

#mysqadmin variables -u username -ppassword ——显示系统变量

#mysqladmin extended-status -u username -ppassword ——显示状态信息

其余show命令可以参考:mysql >help show

2、慢查询日志

慢查询日志开启方法一

在配置文件my.cnf中[mysqld]下加入以下内容并重启mysql服务

Slow_query_log=1 //0关闭 1开启

Slow_query_log_file=/usr/local/mysql/data/slow-query.log //慢查询日志存放地点

Long_query_time=1 //表示查询超过1秒才记录

注:在my.cnf中添加log-queries-not-using-indexes参数,表示向慢查询日志中记录没有使用索引的查询。

慢查询日志开启方法二

通过命令行设置变量来即时启动慢查询日志

查看慢查询的设置信息

打开慢查询日志文件查看

从日志中,可以发现查询时间超过0.01秒的sql,而小于0.01秒的没有出现在此日志中。

如果慢查询日志中记录内容很多,可以使用 mysqldumpslow工具(Msql客户端安装自带)来对慢查询日志进行分类汇总。 mysqldumpslow对日志文件进行了分类汇总,显示汇总后摘要结果。(具体参数可以参考#mysqldumpslow --help)

优化上面的慢查询

二、explain分析查询

使用explain可以模拟优化器执行sql查询语句,从而知道mysql是如何处理你的sql语句的。可以帮助分析查询语句或表结构的性能结果。

通过explain查看,发现没有使用索引查询,而是全表扫描。

优化:在stuname列上创建索引

Mysql > create index index_stuname ontest1.tb1(stuname);

再次执行explain

发现查询语句使用了index_stuname索引查询而非全表查询。

三、Profiling分析查询

如果觉得explain的信息不够详细,可以通过profiling命令得到更准确的sql执行消耗系统资源的信息

查看profiling是否开启

打开profiling功能:mysql >set profiling=1;并查看是否开启

执行测试语句:

四、配置优化

下面列出了对性能优化影响较大的主要变量,分为连接请求的变量和缓冲区变量

1、连接请求变量

Max_connections //mysql的最大连接数

Back_log //mysql能暂存的连接数量

Wait_timeout //mysql在关闭一个非交互的连接之前所要等待的秒数

Wait_timeout //mysql在关闭一个交互的连接之前所要等待的秒数

2、缓冲区变量

Key_buffer_size //索引缓冲区的大小

Query_cache_size //查询缓存简称QC

Max_connect_errors //阻止过多尝试失败的客户端,防止暴力破解密码

Sort_buffer_size //每个需要进行排序的线程分配该大小的缓冲区

Max_allowed_packet=32M //限制server接受的数据包大小

Join_buffer_size=2M //用于表间关联缓存的大小

Thread_cache_size=300 //可以重新利用保存在缓存中线程的数量

3、配置InnoDB的变量

Innodb_buffer_pool_size //指定大小的内存来缓冲数据和索引

Innodb_flush_log_at_trx_commit //控制inodb将log buffer总的数据写入日志文件并flush磁盘的时间点

Innodb_thread_concurrency=0 //设置innodb线程的并发数量

Innodb_log_buffer_size //确定日志文件所用的内存大小

Innodb_log_file_size=50M //确定数据日志文件的大小

Innodb_log_files_in_group=3 //以循环方式将日志文件写到多个文件

Read_buffer_size=1M //mysql读入缓冲区大小

Read_rnd_buffer_size=16M //mysql的随机读缓存区大小

Bulk_insert_buffer_size=64M //批量插入数据缓存大小

在优化之前执行mysqlslap工具测试

相关优化参数总结:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 L宝宝聊IT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档