mysql_connect和mysql_pconnect的区别

26
我有一个疑问,我在网上搜索了一下,答案似乎五花八门。在通过PHP连接数据库时,使用mysql_pconnect优于mysql_connect吗?我读到pconnect可以更好地扩展,但另一方面,拥有10,000个同时连接的持久连接对我来说似乎不可扩展。

提前致谢。

5个回答

35

对于MySQL来说,持久连接应该是不必要的。在其他一些数据库(如Oracle)中,建立连接是昂贵且耗时的,因此如果可以重复使用连接,则会获得很大的优势。但这些品牌的数据库提供了连接池,以更好的方式解决了这个问题。

与那些品牌的数据库相比,连接到MySQL数据库很快,因此对于MySQL使用持久连接所带来的好处相对较少。

持久连接也有缺点。无论是否需要连接,数据库服务器都会为每个连接分配资源。因此,如果连接处于空闲状态,则会看到许多浪费的资源而没有实际用途。我不知道你是否会遇到10,000个空闲连接,但即使只有几百个也很昂贵。

连接具有状态,从先前的PHP请求中“继承”信息会是不合适的。例如,临时表和用户变量通常在连接关闭时被清除,但如果使用持久连接,则不会清除。同样,基于会话的设置,例如字符集和排序规则也是如此。此外,LAST_INSERT_ID()将报告会话期间最后生成的id -- 即使这是在之前的PHP请求期间产生的。

至少就MySQL而言,持久连接的缺点可能超过了它们的优点。而且,还有其他更好的技术可以实现高可伸缩性。


更新于2014年3月:

与其他关系型数据库品牌相比,MySQL的连接速度一直很慢,但现在已经变得越来越快。

请参阅http://mysqlserverteam.com/improving-connectdisconnect-performance/了解更多详情。

在MySQL 5.6中,我们开始着手优化处理连接和断开连接的代码。这项工作在MySQL 5.7中加速进行。在本博客文章中,我将首先展示我们取得的结果,然后描述我们所做的事情以获得这些结果。

阅读该博客以获取更多详细信息和速度比较。


4

mysql_connect()mysql_pconnect() 都用于数据库连接,但有些区别。在 mysql_pconnect() 中,“p” 代表持久连接。

当我们使用 mysql_connect() 函数时,每次它都会根据请求打开和关闭数据库连接。

但是,在 mysql_pconnect() 函数中:

  • 首先,当进行连接时,函数会尝试查找已经使用相同主机、用户名和密码打开的(持久)连接。如果找到一个,将返回其标识符而不是打开新连接。

  • 其次,与 SQL 服务器的连接不会在脚本执行结束时关闭。相反,连接将保持打开状态以供将来使用(mysql_close() 不会关闭由 mysql_pconnect() 建立的连接)。

mysql_pconncet() 在您的网站上有很多流量时非常有用。此时,对于每个请求,它不会打开连接,而是从池中获取连接。这将提高您的网站效率。但对于一般用途,mysql_connect() 是最好的选择。


mysql_pconnect() 这个函数会尝试查找已经使用相同主机、用户名和密码打开的(持久化)连接。我认为这个函数与 mysqlnd 结合使用效果更佳,不知道我的想法是否正确? - consigliere

4
基本上,您需要平衡创建连接的成本和保持连接的成本。尽管MySQL在设置新连接方面非常快,但仍然需要花费时间--线程设置时间以及从Web服务器进行TCP / IP设置时间。这在高流量网站上是明显的。不幸的是,PHP没有任何控制连接持久性的功能。因此,答案是将MySQL中的空闲超时降低很多(例如降至20秒),并增加线程缓存大小。总体而言,这通常非常有效。
另一方面,您的应用程序需要尊重连接的状态。最好不要对会话处于什么状态做出任何假设。如果使用临时表,则使用CREATE IF NOT EXISTS和TRUNCATE TABLE有很大帮助,为其命名也很重要(例如包括userid)。事务有点棘手;但是你的代码始终可以在顶部执行ROLLBACK,以防万一。

在我写这篇回复之后的PHP版本中,我发现现在有一些设置可以调整连接池的大小。特别是5.4.0版本有一个选项mysqli.max_persistent,它是该PHP实例中连接池的最大大小。但是,在PHP中仍然没有超时连接的值。 - staticsan

3
很不可能达到10000个连接。无论如何,请前往官方来源。(重点是我的)。
如果持久连接没有任何附加功能,那么它们有什么用处呢?答案非常简单——效率。如果创建到SQL服务器的链接开销很高,则持久连接很有用。无论这种开销是否真的很高都取决于许多因素。例如,数据库类型、它是否与您的Web服务器在同一台计算机上、SQL服务器所在的计算机负载情况等等。底线是,如果连接开销很高,持久连接将极大地帮助您。它们使子进程仅在其整个生命周期内连接一次,而不是每次处理需要连接到SQL服务器的页面时都连接一次。这意味着对于每个打开持久连接的子进程,都会有自己的打开持久连接到服务器。例如,如果有20个不同的子进程运行一个脚本,该脚本与您的SQL服务器建立了持久连接,则您将拥有20个不同的连接到SQL服务器,每个子进程一个。
但请注意,如果您正在使用具有被持久化子连接超出连接限制的数据库,则这可能会有一些缺点。如果您的数据库最多只能同时连接16个,则在繁忙的服务器会话过程中,如果有17个子线程尝试连接,则其中一个将无法连接。如果您的脚本存在不允许连接关闭(例如无限循环)的错误,则具有仅16个连接的数据库可能会迅速被淹没。请查阅数据库文档以获取有关处理废弃或空闲连接的信息。

0

MYSQL_CONNECT()

1.mysql_connect可以用来关闭连接。每次根据请求打开和关闭数据库连接。

2.在MYSQL connect中,每次加载页面时都会打开数据库。

3.当页面加载时,每次都会加载数据库。

4.它用于关闭连接。

示例:

<?php $conn = mysql_connect(‘host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?>

描述:

主机:指定主机名或IP地址,如localhost。

mysql_user:指定MySQL用户名。

mysql_password:指定MySQL密码。

MYSQL_PCONNECT()

1.我们使用mysql_pconncet()函数时,它会尝试查找一个开放的持久连接。

2.mysql_pconncet()函数打开持久连接。

3.mysql_pconnect()函数不支持关闭连接。

4.mysql_pconnect()函数无法关闭连接。在此处打开一个持久连接到数据库。

5.在mysql_pconncet()函数中,数据库不需要每次都连接。

6.在mysql_pconncet()函数中,数据库不需要每次都连接。

更多详情:http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接