mysql如何处理现实世界中的大量连接?

mysql如何处理现实世界中的大量连接?,mysql,connection,scalability,Mysql,Connection,Scalability,我已经研究了一段时间,但没有得到令人信服的答案 从mysql教程中,默认连接数小于200,并且它说,只要您有足够的资源,Linux框中的max_connection_num可以设置为2000。我认为这个数字远远不够,因为可能有数百万人同时访问你的网站 有几篇文章讨论如何通过每个查询进行优化以减少时间成本。但没有人告诉我这个问题是如何产生的。我认为必须有一些类似队列的机制来防止大量连接同时发生。否则,您将最终得到“太连接”异常 有人在这方面有专长吗?谢谢。通常,应用程序应该重用已经建立的连接。但是

我已经研究了一段时间,但没有得到令人信服的答案

从mysql教程中,默认连接数小于200,并且它说,只要您有足够的资源,Linux框中的max_connection_num可以设置为2000。我认为这个数字远远不够,因为可能有数百万人同时访问你的网站

有几篇文章讨论如何通过每个查询进行优化以减少时间成本。但没有人告诉我这个问题是如何产生的。我认为必须有一些类似队列的机制来防止大量连接同时发生。否则,您将最终得到“太连接”异常


有人在这方面有专长吗?谢谢。

通常,应用程序应该重用已经建立的连接。但是,您选择用于实现应用程序的语言会带来一些限制。如果您使用Java或.Net,您可以拥有连接池。对于PHP,情况并非如此,您可以检查

如果超过最大连接数,则会出现连接过多错误。但是,如果您的web服务器上确实同时有100万用户,那么您无法用一台服务器处理这一问题,100万并发连接确实需要一个非常大的服务器场来处理


但是,数据库的客户端是一个webapp,该webapp通常通过称为a的抽象连接到数据库,只要所有数据库连接都通过同一个池,这就限制了客户端到数据库的连接数。

有几个选项

  • 正如你提到的:排队。如果有太多的客户端同时连接,那么应用层应该处理此异常,将请求暂时休眠,然后重试。在这样的高流量环境中,通常应该禁止持续时间超过几秒钟的请求
  • 通过和/或进行负载平衡

  • 您的问题的简短答案是“连接池”,用于管理与数据库的连接。很多其他的实现,DBCP,C3PO,等等。一个大问题是连接转换的高成本,即重复创建和删除数据库连接。我绝对不同意链接的讨论。PHP持久连接允许连接池中的大部分内容(即跨多个进程重用连接)。@YaK根据官方文档“注意,只有在使用模块版本的PHP时,这些链接才有效。”即使您将PHP用作模块,在PHP中,可以在10个不同的连接中启动10个并发事务吗?可以。我刚刚用mysql_pconnect()测试了它。谢谢你提出这个问题,我从来没有真正验证过。mysqli扩展有一个运行时参数,但我认为其他扩展没有提供这样的功能@谢谢你。总而言之,我发布链接的讨论并不全是错误的嗯,我将HibernateJPA与Spring一起使用,我对“太连接”异常感到惊讶。我的假设是JPA实现应该在内部使用连接池,现在看来不是这样。所以,对于池,当没有可用的连接时会发生什么?在我的记忆中,我曾经使用带有Apache连接池的JDBC,我仍然遇到一些异常,说无法获取连接。如果是这样,那就不行了。理想情况下,它应该将这些请求排队,并在连接空闲时为它们提供服务。就像某些线程池的行为和长时间查询一样,无法预测查询将花费多少时间。无论如何,我不知道JPA、Hibernate或Spring如何处理连接,对不起。MySQL提供了一种TCP级别的排队形式,但我不会太依赖它。您的库可能实现也可能不实现这些机制。您可能想发布另一个关于这些特定框架如何处理池或队列的问题。至于查询执行持续时间,是的,您可以通过查看库生成的实际SQL代码来估计它。您还可以使用MySQL慢速查询日志监控实际执行时间(但只能在运行之后)。@zx_-wing您应该在原始帖子中提到您使用的编程语言/技术。当您遇到“连接太多”异常时,这也很重要。基于其设置的特定池实现可以在启动时初始化所有连接,或者从一个连接开始,并在需要时分配更多连接。当连接池初始化或增长时,很可能出现异常。Java池可用的连接数将取决于MySQL设置。@zx\u wing有一些框架可以帮助您监视SQL查询的性能。其中之一是