前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL -- 短连接 + 慢查询

MySQL -- 短连接 + 慢查询

作者头像
猿哥
发布2019-03-13 15:33:53
2.5K0
发布2019-03-13 15:33:53
举报
文章被收录于专栏:Web技术布道师Web技术布道师

短连接

  1. 短连接模式:连接到数据库后,执行很少的SQL后就断开,下次需要的时候再重连
  2. 在业务高峰期,会出现连接数突然暴涨的情况
    • MySQL建立连接的成本非常昂贵
    • 成本:TCP/IP三次握手 + 登录权限判断 + 获取连接的数据读写权限

max_connections

  1. max_connections:MySQL实例同时存在的连接数上限
  2. 当连接数超过max_connections,系统会拒绝接下来的连接请求,返回:Too many connections
    • 当连接被拒绝,从业务角度来看是数据库不可用
  3. 如果机器负载较高,处理现有请求的时间会变长,每个连接保持的时间也会变长
    • 如果再有新建连接的话,很容易触发max_connections的限制
  4. max_connections的目的是保护MySQL的
    • 如果把max_connections设置得过大,更多的连接就会进来,导致系统负载会进一步加大
    • 大量的资源会耗费在权限验证等逻辑上,而已经拿到连接的线程会抢不到CPU资源去执行业务SQL
代码语言:javascript
复制

清理Sleep状态的连接

KILL CONNECTION:主动踢除不需要保持的连接(与wait_timeout的效果一样)

时刻

sission A

session B

session C

T

BEGIN;INSERT INTO t VALUES (1,1);

SELECT * FROM t WHERE id=1;

T+30s

SHOW PROCESSLIST;KILL CONNECTION

  1. 踢除Sleep状态的连接是有损的
  2. 如果断开sission A的连接,会回滚事务
  3. 如果断开sission B的连接,没有任何影响
    • 优先断开事务外空闲的连接
    • 再考虑断开事务内空闲的连接
事务外空闲

trx_mysql_thread_idid=4的线程还处在事务中

KILL CONNECTION
  1. 服务端执行KILL CONNECTION id,如果连接在此前处于Sleep状态,客户端是不会立马知道
  2. 客户端如果发起下一个请求,报错ERROR 2006 (HY000): MySQL server has gone away
    • 因此,客户端(应用层)需要有重连机制

减少连接过程的消耗

  1. 数据库跳过权限验证阶段 – 风险极高
    • 重启数据库,启动参数--skip-grant-tables
    • 跳过所有的权限验证阶段(连接过程+语句执行过程)
  2. 从MySQL 8.0开始,启用--skip-grant-tables参数,默认会启用--skip-networking(本地客户端)

慢查询

索引没有设计好

古老方案
  1. Online DDLALTER TABLE
  2. 主库A,备库B
  3. 在备库B上执行SET sql_log_bin=OFF(不写binlog),ALTER TABLE加上索引
  4. 执行主备切换,变成主库B,备库A
  5. 在备库A上执行SET sql_log_bin=OFF(不写binlog),ALTER TABLE加上索引
工具

gh-ost

语句没写好

代码语言:javascript
复制

MySQL选错索引

  1. FORCE INDEX
  2. query_rewrite + FORCE INDEX

预先发现问题

  1. 测试环境配置:slow_query_log=ON+long_query_time=0
  2. SQL Review,留意Rows_examined是否与预期的一致
  3. 工具:pt-query-digest

参考资料

《MySQL实战45讲》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 短连接
    • max_connections
      • 清理Sleep状态的连接
        • 事务外空闲
        • KILL CONNECTION
      • 减少连接过程的消耗
      • 慢查询
        • 索引没有设计好
          • 古老方案
          • 工具
        • 语句没写好
          • MySQL选错索引
            • 预先发现问题
            • 参考资料
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档