打开和关闭数据库连接的成本是多少?


15

在MySQL中如何打开和关闭数据库连接(对于Web应用程序),CPU占用率很高

  • ...当数据库软件在本地主机上时?
  • ...当DB软件在另一台机器上时?

Answers:


12

考虑每个数据库连接分配的内存量。必须分配什么东西?根据MySQL 5.0认证研究指南,第357页

服务器为每个客户端连接维护多个缓冲区。一个用作与客户端交换信息的通信缓冲区。每个客户端维护其他缓冲区,以读取表以及执行联接和排序操作。

哪些设置控制每个连接的缓冲区?

建立连接后,需要花费一些时间来分配和释放这些缓冲区。不要忘记将这些值的总和乘以max_connections。附带说明一下,请不要使用mysql_pconnect,因为PHP和MySQL的持久连接关系不佳。这是有关此主题的两个信息链接:

在诸如OLTP之类的重读,重写环境中,这在RAM使用率和由于OS交换可能引起的抑制方面将是昂贵的。在低写,低读的网站上,我不会那么担心。


10

我不确定这是否“昂贵得多”。当然,这比重用相同的连接要昂贵得多。您将观察的内容取决于您是否正确使用了连接池,池的饱和程度,包装盒上的可用资源等。

通常,如果要执行循环以与数据库进行某些交互,那么与重用同一活动连接相比,在循环内打开和关闭好得多(我经常看到这种反模式) 。


4

重复使用对象与将其拆解并重新构建之间的困境(两者都有优点和缺点)通常可以通过以下折衷方法来解决:缓存对象,但是要在有限的时间内(即到期)。如果经常访问该对象,那么它将继续被重用。但是,如果一段时间不使用它,则将使用到期机制来处理它,并在需要再次使用时强制重新创建它。

系统可以具有针对这些类型的缓存的全局挂钩,当内存不足时会调用该挂钩,这会触发所有挂钩来丢弃最近未使用的对象。


2

Mysql使用线程缓存(thread_cache_size)缓存连接(或线程)。最大值为100。当客户端关闭连接时,它将返回到缓存。当新连接打开时,它将检查线程缓存。在非常繁忙的系统上,打开关闭连接可能会变得昂贵,特别是如果您长时间运行查询。

https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html 如果您负担得起Mysql Enterprise,则可以使用Mysql 5.6中实现的线程池插件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.