【问题标题】:What is the best way to minimize number of connections?最小化连接数量的最佳方法是什么?
【发布时间】:2021-03-16 11:25:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您获得了多少流量?如果您经常有 15 个并发用户,我想max_user_connections 并不是您在低端托管计划中遇到的唯一问题。现在,假设单个脚本调用从开始到结束需要 0.33 秒,或者在访问数据库的持续时间内。这意味着您每秒将拥有 45 个唯一用户(假设用户不是每秒都加载页面!)。这是繁忙的交通。如果不是这种情况,您可能正在运行 persistent connections,这会占用您的连接配额。
  • 在任何情况下,为每个查询关闭和重新打开数据库链接将是巨大的开销,并且可能会使每个用户每次调用的总数据库使用时间超过数据库链接只是打开时的时间持续时间。是的,您总是可以捕获失败的连接尝试,让脚本休眠片刻,然后重试。如果没有其他帮助,作为最后的手段。只是为了记录,每个页面调用平均运行多少查询?另外:确保每个页面加载时不会有大量 AJAX 调用导致唯一的数据库连接。
  • 15 一点也不低。拥有数千名访问者的网站应该没问题。
  • 每隔几秒钟重新连接几次是一场灾难。这意味着您的脚本将运行“几秒钟”而不是几毫秒,使其无法连接其他客户端。我的意思是连接到网络服务器。
  • 在每个功能中连接也是一场灾难。连接操作相对较慢,您的脚本将执行更长时间,再次消耗服务器资源。遵循以下答案中的建议,您会没事的。顺便说一句,好问题。

标签: php optimization mysqli


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多