MySQL性能调优思路

1.MySQL性能调优思路

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

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

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

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

观察服务器状态, 通常用以下2个命令bash

Show status;

Show processlist;

: mysql> show status;服务器

   #mysqladmin ext性能

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

解决办法:优化

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

2: 若是请求数是必定的,不可减小的. 咱们要尽可能让请求数平稳,不要有剧烈波动.code

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

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

不规则的延迟现象每每是因为效率低下的语句形成的,如何抓到这些效率低的语句.

能够用show processlist命令长期观察,或用慢查询.

Show processlist;

这个命令是显示当前全部链接的工做状态.

#!/bin/bash

while true

do

mysql -uroot -e 'show processlist\G'|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,拆出来单放一张表.

建索引: 合理的索引能够减小内部临时表(索引优化策略里详解)

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

相关文章
相关标签/搜索