mysql-连接器

连接器

我们使用客户端和 Mysql 进行连接的时候,Mysql 连接器就负责管理连接,建立连接,获取权限,维持连接

具体的一个连接操作:

连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

  • 如果用户名或密码不对,你就会收到一个”Access denied for user”的错误,然后客户端程序结束执行。
  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

这就意味着,一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置。

客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。

建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接****。

但如果全部使用长连接的话,会出现一个问题:

MySQL 建立连接的时候,每个客户端连接都会有一个对应的连接对象(Connection Object),这个连接对象会维护连接过程中的一些状态信息,比如事务状态、锁信息、临时表等。同时,连接对象也会维护一些缓存信息,比如查询结果缓存、语句缓存等。这些缓存信息会占用一定的内存空间。

当MySQL执行查询语句时,会为查询分配一些内存空间,用于存储临时表、排序缓存、哈希表等中间结果。这些内存空间是从连接对象中分配的,因此被称为连接内存(Connection Memory)。这些内存空间只有在连接断开的时候才会被释放,因为它们是绑定在连接对象上的,只有当连接对象被销毁时,这些内存空间才会被系统回收。

如果使用长连接,那么连接对象会一直存在,连接内存也就会一直被占用。如果多个长连接同时存在,那么这些连接对象和连接内存就会累积,导致MySQL占用的内存空间越来越大。因此,长连接也需要注意内存占用问题,需要在代码中合理管理连接对象和连接内存的生命周期,避免内存泄漏和OOM问题的发生。

所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

怎么解决这个问题呢?你可以考虑以下两种方案。

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连****。
  2. 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。

之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。

如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端

但是大多数情况下建议不要使用查询缓存,查询缓存往往弊大于利。

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

查询缓存是以查询语句作为 key,如果查询的数据发生了变化,那么查询语句所对应的结果也会发生变化,即使查询语句不变。

因此,当数据发生变化时,MySQL会自动使查询缓存失效,下次查询时会重新执行查询语句并缓存新的结果。这也是为什么有时候查询缓存机制反而会降低性能的原因,因为每次数据发生变化时都需要重新查询并缓存结果,而且查询缓存本身也会占用一定的内存空间。

除非你的业务就是有一张静态表,很长时间才会更新一次。

比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。

MySQL 也提供了这种“按需使用”的方式。可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。

而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样:

mysql> select SQL_CACHE * from T where ID=10

需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《mysql-连接器》
文章链接:https://zhuji.vsping.com/3556.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。