首页 > 解决方案 > 最小化连接数量的最佳方法是什么?

问题描述

对于数据库用户,我的主机的最大连接数非常非常低。这是我的用户遇到的错误:

用户 'username_here' 已超过 'max_user_connections' 资源(当前值:15)。

我不认为提高这个价值在我的能力范围内,除非我升级到一个更昂贵的计划,所以我正在寻找一种有效使用这 15 个连接的方法。我处理连接的方式如下:我在每次页面加载开始时加载的脚本中连接到数据库,然后将该连接传递给运行查询的函数。我想我可以通过在查询函数中打开连接并在返回语句之后立即关闭它来最小化连接打开的时间,这很好还是我无缘无故地让事情变得更复杂?

作为最后的手段,我正在考虑将连接放在 try/catch 中,并尝试每隔几秒钟重新连接几次。这会是明智的做法,还是更糟?

标签: phpoptimizationmysqli

解决方案


以下是优化连接数的方法:

  • 确保您没有在任何地方使用持久连接。这是丢失打开连接跟踪的最简单方法,也是可用连接用完的最常见原因。在 mysqli 中,持久连接是通过p:在连接时添加到主机名来打开的。
  • 确保您只对每个 HTTP 请求打开一个连接。不要打开和关闭它们,因为这会很快失控并对您的应用程序产生不良的性能影响。有一个全局连接,您可以将其传递给需要它的函数。
  • 优化您的查询,以便更快地处理它们并更快地释放连接。这也适用于优化索引和摆脱 N+1 问题。(根据经验,我可以说 PDO 在重构代码以避免设计不良的查询方面有很大帮助。)
  • 如果您需要在同一进程中执行其他一些耗时的任务,请先执行所有 SQL 操作,然后关闭连接。同样适用于打开连接。只有当你知道你需要它时才打开它。

如果您发现自己遇到了超出“max_user_connections”限制的问题,那么这意味着您的 Web 服务器配置不正确。在理想情况下,MySQL 连接将是无限的,但在共享主机上,必须设置此限制以防止资源滥用(意外或故意)。但是,可用 MySQL 连接的数量应该与可用服务器线程的数量相匹配。这可能是一个非常固执己见的话题,但我想说,如果您的应用程序需要对每个请求执行一些 SQL 操作,那么可用服务器连接数不应超过可用 MySQL 连接数。在 apache 上,您可以计算可能的连接数,如此链接所示。

在一个设计合理的应用程序上,即使有 15 个并发 MySQL 连接,您仍然应该能够每秒处理令人满意的请求量。例如,如果每个请求需要 100 毫秒才能完成,那么您每秒可以处理 150 个请求。


推荐阅读