美文网首页
MySQL优化

MySQL优化

作者: 麟之趾a | 来源:发表于2020-04-26 22:41 被阅读0次

优化哲学

优化有风险

优化的范围

存储 主机 和操作系统

  • 主机架构稳定性
  • I/O规划及配置
  • swap》
  • OS内核参数
  • 网络问题

应用(index,lock,session)

  • 应用程序稳定性 和性能
  • SQL语句性能
  • 串行访问资源
  • 性能欠佳会话管理

数据库优化(内存,数据库设计,参数)

  • 内存
  • 数据库结构(物理&逻辑)
  • 实例配置

优化工具介绍

系统层

cpu

一般做数据处理(主要功能)和调度资源(次要功能)

top命令

%cpu  当前某个程序占用的cpu的时间百分比
800%:代表8核cpu占用时间比,为百分之百。单核cpu,做多占用100%
us: 用户程序占用系统cpu时间的百分比,平均所有cpu的资源。cpu花费在计算方面的资源
sy: 内核程序占用系统的cpu时间的百分比,平均所有cpu资源,cpu花费在调度方面的资源
sy过高的原因:
内核本身有bug
并发很高(MySQL是单进程,多线程模式),需要频繁调用资源给线程
锁的原因
id: 空闲cpu时间占比
wa: cpu要等待的时间占比
cpu要处理程序。
程序由指令+数据组成,
wa 是 cpu等待数据的过程(也是等待IO的过程)。可能是MySQL等待大的事务处理,也可能是锁的问题

top  按 1,指看MySQL对cpu使用的情况,看资源分配是否均匀

MEM

缓存和缓冲(cpu和IO的中间地带)

MySQL 不建议使用swap

IO

输入和输出

iostat 工具 yum -y install sysstat iostat 结合cpu和内存去查看
glances 工具 yum -y install glances

数据库层面

状态查看命令

show status
show variables
show index
show processlist
show slave status
show engine innodb status
sc /explain
slowlog

扩展类深度优化

pt系列
pt-query-digest,pt-osc,pt-index
mysqlslap
sysbenchD
information_schema(I_S)
performace_schema(P_S)
sys

优化思路

主机 存储 网络

主机

真实的硬件(pc_server): Dell R系列,华为,浪潮,HP,曙光,联想
云产品: ECS ,数据库RDS,DRDS,PolorDB
IBM小型机: P6 570,595, P7 720 750 780 P8

cpu

OLTP:混合型,增删改查都涉及,IO密集型
OLAP: 数据仓库,专门做查 CPU密集型
I
O密集型:
线上系统,OLTP主要是IO密集型的业务,高并发(E系列,至强,主频相对低,核心数量多)
CPU密集型: 数据分析,数据处理,OLAP,需要CPU高计算能力(i系列 ,IBM power系列)

内存

建议2-3倍cpu的核心数量(ECC)

磁盘

SATA-III 、SAS 、FC 、SSD(SATA) 、PCI-e ssd 、Flash

存储

根据存储类型不同,选择不同不同存储设备
配置合理的RAID级别(RAID5,RAID10,热备盘)

网络

  • 硬件买好的(单卡单口)
  • 网卡绑定(多网卡多口)
    网卡绑定 1.主备(一个网卡坏了,另一个网卡顶替) 2.轮询(负载均衡,两个网卡同时工作)

系统层面

swap调整

echo 0 > /proc/sys/vm/swappiness
默认30,内存用到了70%,就使用swap
永久修改:

vim /etc/sysctl.conf
vm.swapiness=0
sysctl -p

IO 调整策略

centos7: 默认deadline
centos6: 修改为deadline

 cat /sys/block/sda/queue/scheduler 
noop [deadline] cfq 

deadline 是最后期限,有效降低cpu wait的指标。如果IO等待不来,就进行下一个IO

实例优化(参数)

Max_connections [重要]

最大连接数(并发),对于单机来讲最多3000个,瓶颈在IO上

  • 可以先评估
  • 可以先调测试值
    评估依据
mysql> show status like 'Max_used_connections';  # 最大使用的连接数
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 13    |
+----------------------+-------+
1 row in set (0.00 sec)

1 .开始数据库时,我们可以设置一个比较大的测试值
2 .观察 show status like 'Max_used_connections;' 变化
3 .如果max_used_connections 跟 Max_connections 相同,那边Max_connections设置过低,或者超过服务负载上限了

back_log

当Max_connections到达最大连接时,用户再连接进来就会放入back_log中,相当于等待连接。如果等待连接的数量超过back_log中,将不会授予该连接资源。如果期望短时间内有很多连接,可以增加它

判断依据
show full processlist
当发现大量的待连接进程时,就需要加大back_log或者Max_connections的值
修改方式

vim /etc/my.cnf
back_log=1024

wait_timeout 和 interactive_timeout

wait_timeout:只连接数据库的,非交互试连接等待的时间(只连接的数据库连接什么都不做)一般把此参数调小
interactive_timeout: 只连接数据库,交互式连接等待的时间(只连接数据库的连接做增删改查操作)一般不调此参数
wait_timeout=60
interactive_timeout=1200
对于interactive_timeout调整,我们应询问开发人员长连接最多持续多长时间

key_buffer_size [重要]

  • MyISAM 表的索引缓冲区
  • 临时表的缓冲区
    临时表:当两个表做join联合查询时,会生成一个临时表,临时表可以在磁盘中,也可以在缓冲区中
mysql> show status like 'created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 1     |
+-------------------------+-------+
3 rows in set (0.01 sec)

crated_tmp_tables  值在内存中建立的临时表
created_tmp_disk_tables 指在磁盘中创建的临时表
created_tmp_tables/(created_tmp_disk_tables+created_tmp_tables) 越高越好
created_tmp_disk_tables/(created_tmp_disk_tables+created_tmp_tables)  一般控制在5%-10%

max_connect_errors

MySQL的错误连接次数,是个计数器。一般设置很大

sort_buffer_size 、join_buffer_size 、 read_buffer_size 、 read_rnd_buffer_size

以上都是私有内存,即每个连接都占用内存。一般对于以上添加内存的做法,是调整索引优化。以上的参数一般设置小于2M

max_allowed_packet [重要]

控制server接受数据包的大小

有时候大的插入和更新会受max_allowed_packet参数的限制,导致写入或更新失败。必须设置成1014的倍数
max_allowed_packet=256M

thread_cache_size [重要]

线程缓存的个数,即在内存中的不会被释放的线程,如果客户端请求频繁,减少cpu的调度时间,拿内存资源换cpu资源1G=4 2G=8 3G=12 4G或更多=32

innodb_buffer_pool_size [非常重要]

innodb引擎的缓存区域,一般设置成物理内存70%,最大不超过80%

双一标准

innodb_flush_log_at_trx_commit=1
sync_binlog=1

innodb_thread_concorency

控制innodb线程的并发数量,使用cpu数量,官方最大支持64个cpu
设置标准
show processlit; 如果cpu并发处理能力差,可能此处会达到Max_connections的值
top 按 1
看cpu的繁忙程度,如果平均,则表示cpu已是使用最大限度。如果不平均,可调整此参数(从小到大)然后top 在查看cpu的使用情况,是否已经平均

innodb_log_buffer_size [重要]

控制redo日志缓冲的大小,如果内存太小,会造成脏页刷写频繁

innodb_log_file_size [重要]

控制redo日志的大小,如果太小,会造成redo日志轮询速度过快

innodb_log_files_in_group [重要]

控制redo日志轮询的组数,默认是3个

innodb_flush_method [重要]

redo日志的刷写策略

相关文章

网友评论

      本文标题:MySQL优化

      本文链接:https://www.haomeiwen.com/subject/ueujwhtx.html