MySQL有哪些“饮鸩止渴”提高性能的方法?
短连接风暴
正常的短连接模式就是连接到数据库后,执行很少的 SQL 语句就断开,下次需要的时候再重连。
怎么解决短连接引起数据库连接数暴涨的问题?
-
先处理掉那些占着连接但是不工作的线程。怎么做呢?
show processlist
, 踢掉显示为sleep的线程,但是这样也会误杀执行事务的线程,使用命令select * from information_schema.innodb_trx;
进一步过滤掉trx_mysql_thread_id 的事务。 服务端终止连接的命令是 kill connection + id -
减少连接过程的消耗。让数据库跳过权限验证阶段,方法是重启数据库时,启动命令带上
--skip-grant-tables
。 风险很高。
慢查询性能问题
索引没有设置好
线上因为索引没有设置好的花,MySQL5.6后支持 online DDL了,那么直接alter table创建索引。
如果有数据库设置了主备,一般是现在备库执行DDL。 流程是这样
- 备库执行
set sql_log_bin=off
不写binlog, 执行DDL加上索引 - 执行主备切换
- 在原来的主库上执行set_sql_log_bin=off, 执行DDL加上索引。
实际应该考虑使用gh-ost这样的工具来执行。但如果需要紧急处理,上面的流程是最稳妥的。
SQL语句没写好
MySQL5.7之后,可以通过query_rewrite
重写有问题的语句
mysql> insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "db1");
call query_rewrite.flush_rewrite_rules();
如果MySQL选错了索引,使用force index
QPS 突增
- 新上业务导致的问题,直接删除新业务的MySQL用户或者把新业务从数据库白名单去除。
- 直接将压力最大的SQL重写为
select 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
2019-03-12 tcpdump命令抓包参数