MySQL
MySQL 入门
MySQL 的特点知识
MySQL 架构
MySQL 优化
系统层优化
- 关闭大页(huge page)
- 防止 OOM 和 SWAP 的情况
- 关闭 SWAP(建议)
- 强制使用内存,当内存不足时抛出 OOM,而不是继续使用 MySQL,造成瓶颈,当然这块得看如何抉择,一是监控内存情况保证高可用,二是允许 SWAP,防止宕机
- 脏页比例
- 当到一定比例时,操作系统会优先做脏页的处理,其他线程会挂起
sysctl -a | grep -i dirty
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.br-f176b775a278.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.dirty_background_bytes = 0
# (此项可设为5,保证脏页比例小)
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_expire_centisecs = 3000
vm.dirty_ratio = 30
vm.dirty_writeback_centisecs = 500
MySQL 关键选项
- 配置项
- binlog_format=row 以行记录
- sync_binlog=1 提交事务前,开启 binlog 到磁盘的同步,最安全但对性能有影响,毕竟已有 binlog 就开始写磁盘
- long_query_time=0.01~0.1
- interactive_timeout/wait_timeout=600 长时间不用的连接断开,如有需要,client 自己尝试重连
可以通过
select * from user_summary \G;
查询连接的人占用 buffer 情况,选择性 kill 掉 - sql_safe_updates=1 保证删除/更新条件必须有 where 索引 or limit clause
- innodb_buffer_pool_size
相关组成
查询缓存
在 Mysql5.7 及以前,每次查询时服务器先查询缓存,如果命中了则返回,如果未命中则尝试解析执行,并将最终结果刷入缓存中
判断是否命中
缓存是存放在一个引用列表中,通过哈希值引用,包含但不限于查询语句、数据库相关影响查询结果的参数
失效缓存实现
如果某张表发生写入,则直接将该表的所有缓存都失效
Mysql8 去掉查询缓存的原因
- 性能考虑
- 关闭后性能直升
- 此外这项不能与高吞吐量工作负载情况下进行负载
- 此外根据压测结果测试,缓存越靠近客户端,效果越明显
- 在 Client+2x ProxySQL 压测结果中显示,将缓存移动到客户端时,性能提高了 5.2 倍
参考资料
- https://blog.csdn.net/weixin_42527464/article/details/113295342
- https://segmentfault.com/q/1010000020193281