MySQL性能调优思路

摘要:
它是服务器的整体性能还是单个语句?对于单个语句,是等待语句的时间还是查询的时间?
1.MySQL性能调优思路 MySQL性能调优思路第1张

如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理?

是周期性的变化还是偶尔问题?是服务器整体性能的问题, 还是某单条语句的问题?

具体到单条语句, 这条语句是在等待上花的时间,还是查询上花的时间?

1.1. 监测并观察服务器的状态.

观察服务器状态, 一般用如下2个命令

Show status;

Show processlist;

: mysql> show status;

   #mysqladmin ext

1.2. MySQL的每秒请求数周期性变化,随着缓存失效,有短时间的高峰

解决办法:

1: 减少无关请求(业务逻辑层面,暂不讨论,但其实是最有效的手段)

2: 如果请求数是一定的,不可减少的. 我们要尽量让请求数平稳,不要有剧烈波动.

很多时候,不是服务器撑不住总的查询量,而是在某个时间段撑不住高峰请求.

1.3.对于不规则的延迟现象的观察

不规则的延迟现象往往是由于效率低下的语句造成的,如何抓到这些效率低的语句.

可以用show processlist命令长期观察,或用慢查询.

Show processlist;

这个命令是显示当前所有连接的工作状态.

#!/bin/bash

while true

do

mysql -uroot -e 'show processlistG'|grep State:|uniq -c|sort -rn

echo '---'

sleep 1

Done

如果观察到以下状态,则需要注意

converting HEAP to MyISAM     查询结果太大时,把结果放在磁盘 (语句写的不好,取数据太多)

create tmp table                         创建临时表(group时储存中间结果,说明索引建的不好)

Copying to tmp table on disk   把内存临时表复制到磁盘 (索引不好,表字段选的不好)

locked                                         被其他查询锁住 (一般在使用事务时易发生,互联网应用不常发生)

logging slow query                   记录慢查询

1.4. mysql 5.5 以后加了一个profile设置,可以观察到具体语句的执行步骤.

查看profile是否开启

Show  variables like ‘profiling’

 开启profile

 set profiling=on;

查看profiles;

show profiles;

查看profile;

show profile for query 1;

2. 如何定位到有问题的语句?

  • 开启服务器慢查询
  • 了解临时表的使用规则      

2.1. MySQL如何使用内部临时表

在处理请求的某些场景中,服务器创建内部临时表. 即表以MEMORY引擎在内存中处理,或以MyISAM引擎储存在磁盘上处理.如果表过大,服务器可能会把内存中的临时表转存在磁盘上.

用户不能直接控制服务器内部用内存还是磁盘存储临时表

2.2. 临时表在如下几种情况被创建:

如果group by 的列没有索引,必产生内部临时表,

如果order by group by为不同列时,或多表联查时order by ,group by 包含的列不是第一张表的列,将会产生临时表

distinct order by 一起使用可能会产生临时表

如果使用SQL_SMALL_RESULT,MySQL会使用内存临时表,除非查询中有一些必须要把临时表建立在磁盘上.

union合并查询时会用到临时表

某些视图会用到临时表,如使用temptable方式建立,或使用union或聚合查询的视图

想确定查询是否需要临时表,可以用EXPLAIN查询计划,并查看Extra,看是否有Using temporary.

如果一开始在内存中产生的临时表变大,会自动转化为磁盘临时表. 内存中临时表的最大值为tmp_table_sizemax_heap_size中较小值.

这和create table时显示指定的内存表不一样:这些表只受max_heap_table_size系统参数影响.

当服务器创建内部临时表(无论在内存还是在磁盘),create_tmp_tables变量都会增加.

如果创建了在磁盘上内部临时表(无论是初始创建还是由in-memory转化),

create_tmp_disk_tables 变量都会增加.

一些情况下限制了内存临时表的使用,而使用磁盘临时表:

(使用了内部临时表的前提下) 语句中存在BLOBTEXT

GROUP BY DISTINCT子句中有大于512字节的string

UNIONUNION ALL,SELECT语句里有大于512字节的string.

建表: 表结构的拆分,如核心字段都用int,char,enum等定长结构;非核心字段,或用到text,超长的varchar,拆出来单放一张表.

建索引: 合理的索引可以减少内部临时表(索引优化策略里详解)

写语句: 不合理的语句将导致大量数据传输以及内部临时表的使用.

免责声明:文章转载自《MySQL性能调优思路》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇小程序开发常见问题java实现 http请求的同步和异步发送下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转: mysql create view 创建视图

以下的文章主要是对MySQL视图的描述,其中包括MySQ视图L概述,以及创建MySQL视图—create view与修改MySQL视图——alter view等相关内容的具体描述,以下就是文章的具体内容介绍。 一. 视图概述 MySQL视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数...

浅析Mysql 数据回滚错误的解决方法

介绍一下关于Mysql数据回滚错误的解决方法。需要的朋友可以过来参考下 MYSQL的事务处理主要有两种方法。1、用begin,rollback,commit来实现begin 开始一个事务rollback 事务回滚commit 事务确认2、直接用set来改变mysql的自动提交模式MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以...

Mac环境下mysql安装以及登录

先安装Django,这个简单,命令行进入Django文件夹,执行 sudo python setup.py install  搞定!   安装Django 接下来就开始安装折磨我的mysql  下载地址:http://dev.mysql.com/downloads/mysql/  选择 dmg格式   Mysql下载目录 下载完毕后,双...

mysql之面试问题总结

问题1、char 与varchar的区别?        varchar是变长而char的长度是固定的。如果你的内容是固定的大小,char性能更好。       char[4] 与varchar[4]   存储字母a a占一个字符  varchar长度为4但是占此时为一个字符长度   而char则占4个字符 问题2、truncate 和delete 区别是...

Oracle基础(九) Oracle的体系结构

一、Oracle体系结构概述:   Oracle的体系结构是指数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。要了解Oracle数据库的体系结构,必须理解Oracle系统的重要概念和主要组件。   Oracle系统体系结构由三部分组成:内存结构,进程结构,存储结构。。如下图所示:        1、内存结构(SGA、PAG)   内存结构...

docker-compose .netcoreapi、mysql、nginx多容器部署

前言: ​ 基于上一篇.NetCoreApi容器与MySql容器互联,此处利用docker-compose来快速配置启动mysql容器与.NetCoreApi容器。 注意: ​ docker-compose.yml的编写缩进不要用tab,要直接用空格(坑了我很久。。。) 一、编写docker-compose.yml文件 version: "3" servi...