MySQL全局优化

发布于:2025-05-14 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

1 硬件层面优化

1.1 CPU优化

1.2 内存优化

1.3 存储优化

1.4 网络优化

2 系统配置优化

2.1 操作系统配置

2.2 MySQL服务配置

3 库表结构优化

4 SQL及索引优化


mysql可四个层面考虑优化分别是

  • 硬件
  • 系统配置
  • 库表结构
  • SQL及索引

成本优化效果以上四方面优化如下

1 硬件层面优化
1.1 CPU优化

选择高性能多核处理器可以有效提升高并发处理能力

1.2 内存优化
  • MySQL InnoDB存储引擎使用缓冲缓存数据索引足够内存可以更多数据缓存减少磁盘I/O操作
  • 增加物理内存同时需要调整MySQL服务配置innodb_buffer_pool_size一般设置物理内存70%~80%
1.3 存储优化
  • 使用SSD提供更好地磁盘IO能力
  • 如果不能完全使用SSD替换可以考虑部分替换
  • 比如redo日志undo日志binlog日志重要日志存储路径指向SSD磁盘
1.4 网络优化
  • 提高网络吞吐能力
  • 减少网络传输
2 系统配置优化
2.1 操作系统配置
  • 文件描述符限制ulimit -n
  • tcp参数调优

参数

作用

影响

tcp_window_scaling

允许网络连接两端使用比标准创建大小(65535字节)更大接收窗口

对于广域网或者数据中心数据传输非常有用

可以减少由于网络延迟造成传输瓶颈

net.ipv4.tcp_fastopen

允许三次握手期间传输数据

减少了建立连接时间

对于频发短连接场景有利

tcp_keepalive_time

tcp连接多久没有活动后开始发送保活探测

适当调整配置可以帮助更快检测断开连接

避免长时间占用资源等待无响应客户端

避免设置太短产生不必要流程

tcp_tw_reuse

允许TIME_WAIT状态套接字用于相同四元组连接

可以更快复用TIME_WAIT状态端口

  • 选择合适文件系统比如ext4或者xfs
  • 禁用 atime 更新减少不必要磁盘写入
2.2 MySQL服务配置

参数

说明

max_connections

最大连接

连接创建意味需要分配系统资源内存文件描述符

连接建立时分配内存=线程栈空间 (thread_stack)+基本的连接管理结构较小且固定)

执行全表扫描分配缓冲区(read_buffer_size)

执行没有索引查询分配连接缓冲区join_buffer_size

需要排序操作分配排序缓冲区sort_buffer_size

需要使用临时表分配临时缓冲tmp_table_size, max_heap_table_size如果需要临时表超过内存大小使用磁盘存储临时表

如果系统内存不足将会使用磁盘swap内存导致性能降低

因此需要设置合适连接

max_user_connections

单个用户允许最大连接

back_log

暂存连接超过最大连接小于该设置值时立即失败而是等待资源释放

wait_timeout

jdbc连接空闲一定时间断开连接

interactive_timeout

mysql client连接空闲一定时间断开

sort_buffer_size

排序缓冲区可以加速order bygroup by

每个连接分配排序缓冲区

join_buffer_size

表关联缓冲区关联不走索引使用缓冲区驱动一部分数据读取缓冲区然后驱动进行关联查询查询完成清理缓冲区继续驱动剩余数据读取缓冲区进行关联查询

每个连接分配表关联缓冲区

innodb_thread_concurrency

innodb并发线程

默认值0表示不限制

通常设置cpu核心数或者核心数2

innodb_buffer_pool_size

innodb缓冲区大小

一般物理内存70%~80%

innodb_lock_wait_timeout

行锁锁定时间

默认值50s

innodb_flush_log_at_trx_commit

redo日志落盘时机

  • 设置为0:表示每次事务提交时都将redo日志写入redo日志缓冲区,数据库宕机时可能会丢失数据
  • 设置为1时(默认值),表示每次事务时都会将redo日志持久化到磁盘,数据最安全,不会因为数据库或者系统宕机导致数据丢失,但是性能差一点
  • 设置为2时,表示每次提交事务时都只是将redo日志写到操作系统缓存(page cache)中,这种情况数据库宕机不会丢失数据,操作系统宕机的话,如果page cache中的数据没来的及写入磁盘文件的话就会丢失数据

sync_binlog

binlog落盘时机

  • 为0时(默认),表示每次提交事务只写到os 缓存page cache中,由操作系统自行判断什么时候执行fsync写入磁盘,服务器宕机时有可能丢失数据
  • 为1时,表示每次提交事务都会执行fsync写入磁盘
  • 当>1时,表示每次提交事务都写入到os缓存page cache中,当积累N个事务后调用fsync写入磁盘,服务其宕机时最多丢失N个事务

  • 如何判断服务器内存达到瓶颈
  • 查看服务状态得到命中innodb缓存命中率命中率过小说明缓冲数据频繁交换
 show global status like 'innodb%read%'\G;

参数

说明

nnodb_buffer_pool_reads

物理磁盘读取次数

nnodb_buffer_pool_read_ahead

预读次数

nnodb_buffer_pool_read_ahead_evicted

预读但是没有后续被读取缓冲池替换数量

用于判断预读效率

nnodb_buffer_pool_read_requests

缓冲池读取次数

nnodb_buffer_pool_read_requests

总共读入字节数

nnodb_data_reads

发起读取次数每次读取可能读取多个

3 库表结构优化
  • 选择合适字段类型
  • 选择合适字段大小
  • 选择合适存储引擎
  • 小表
4 SQL及索引优化

参见索引优化章节


网站公告

今日签到

点亮在社区的每一天
去签到