MySQL性能优化
关于MySQL性能问题查找及优化的点滴.
另一篇记录:MySQL基础
常用参数
# /etc/my.cnf
[mysqld]
max_connections=1000 # 最大连接数
innodb_buffer_pool_size=4G # 缓存池大小,建议< 80% 总内存
# 时间超过2秒的SQL记录在慢查询日志
long_query_time=2
# 用以下面响应时间分布的收集
query_response_time_stats = on
innodb_buffer_pool_size 推荐大小
计算RIBPS(Recommended InnoDB Buffer Pool Size)基于所有InnoDB数据大小和额外60%索引大小.
SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
FROM information_schema.tables WHERE engine='InnoDB') A;
实际占用大小为:
SELECT (PagesData*PageSize)/POWER(1024,3) DataGB FROM (SELECT variable_value PagesData FROM information_schema.global_status WHERE variable_name='Innodb_buffer_pool_pages_data') A,(SELECT variable_value PageSize FROM information_schema.global_status WHERE variable_name='Innodb_page_size') B;
利用多核CPU
# 无限并发
innodb_thread_concurrency = 0
# 下面两个值最大设置为64
innodb_read_io_threads
innodb_write_io_threads
检查当前慢查询并运行EXPLAIN
mysql> SHOW FULL PROCESSLIST;
# 找到上面经常出现的SQL语句
EXPLAIN SQL-Statement
状态sending data意味着正在等待从磁盘或内存读取数据并发送出去,即 reading and filtering data.
PMM的MySQL Query Response Time仪表盘
PMM(Percona Monitoring and Management)的开源监控工具还是很好用的.
安装PMM服务端
建议使用docker的方式
# 获取镜像
docker pull percona/pmm-server:2
# 创建pmm-data容器以持久化数据
docker create \
-v /srv \
--name pmm-data \
percona/pmm-server:2 /bin/true
# 创建并运行pmm-server容器
docker run -d \
-p 80:80 \
-p 443:443 \
--volumes-from pmm-data \
--name pmm-server \
--restart always \
percona/pmm-server:2
配置客户端 (在运行MySQL的主机)
# CentOS
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install pmm2-client
# Ubuntu 先获取
# wget https://www.percona.com/downloads/pmm2/2.2.0/binary/debian/bionic/x86_64/pmm2-client_2.2.0-6.bionic_amd64.deb
# 配置
pmm-admin config --server-insecure-tls --server-url=https://admin:admin@192.168.100.1:443
# 增加MySQL监控
pmm-admin add mysql --query-source=slowlog --username=pmm --password=pmm
# 查看当前状态
pmm-admin list
pmm-admin使用
- pmm-admin ping
- pmm-admin config
- pmm-admin info
- pmm-admin stop —all
- pmm-admin uninstall
设置以记录Response Time分布
安装必要的插件:
mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_AUDIT SONAME 'query_response_time.so';
mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME SONAME 'query_response_time.so';
mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_READ SONAME 'query_response_time.so';
mysql> INSTALL PLUGIN QUERY_RESPONSE_TIME_WRITE SONAME 'query_response_time.so';
# 检查当前安装插件状态
mysql> SHOW PLUGINS;
开启数据收集:
SET GLOBAL query_response_time_stats = 'ON';
# 检查是否生效
show variables like '%query_response_time%';