2008-10-29 38 views
22

我有這個疑問,我搜索了網頁,答案似乎是多樣化的。當通過PHP連接到數據庫時,通過mysql_connect使用mysql_pconnect會更好嗎?我讀到pconnect的規模要好得多,但另一方面,作爲一個持久的連接......同時擁有10000個連接,所有這些連接都是持久的,對我來說似乎不是可擴展的。mysql_connect VS mysql_pconnect

在此先感謝。

回答

33

MySQL的持久連接應該是不必要的。在其他數據庫(例如Oracle)中,建立連接既昂貴又耗時,所以如果您可以重新使用連接,這將是一個巨大的勝利。但是這些品牌的數據庫提供連接池,可以更好地解決問題。

與其他品牌相比,與MySQL數據庫的連接速度很快,因此使用持久連接對MySQL的效益比其他品牌的數據庫的效益要低。

持續性連接也有缺點。數據庫服務器爲每個連接分配資源,無論連接是否需要。因此,如果連接閒置,您會看到大量無用的資源。我不知道你是否會達到10000個空閒連接,但即使是幾百個連接也是昂貴的。

連接有狀態,並且PHP請求從先前由另一個PHP請求使用的會話「繼承」信息是不合適的。例如,臨時表和用戶變量通常會在連接關閉時清除,但如果使用持久連接則不會。類似於基於會話的設置,如字符集和整理。此外,LAST_INSERT_ID()會報告會話期間最後生成的id--即使這是之前的PHP請求期間生成的。

對於MySQL來說,至少對持久連接來說,缺點可能超過了它們的好處。還有其他更好的技術來實現高可擴展性。


更新2014年3月:

MySQL連接速度總是低於其他品牌的RDBMS的,但它變得更好。

http://mysqlserverteam.com/improving-connectdisconnect-performance/

在MySQL 5.6,我們開始優化代碼處理的連接和斷開工作。而這個工作在MySQL 5.7中已經加速。在這篇博文中,我將首先展示我們已經取得的成果,然後描述我們已經做了什麼來獲得它們。

閱讀博客以瞭解更多細節和速度比較。

3

這很可能會達到10000個連接。總之,去official source。 (強調我的)。

如果永久連接沒有任何 附加功能,有什麼 他們好?

這裏的答案非常簡單 - 效率。如果創建到您的SQL服務器的鏈接 的開銷很高,則持久連接爲 。是否或 不是這個開銷是真的很高 取決於許多因素。比如,它是什麼樣的 類型的數據庫,是否或者 不是它坐在你的web服務器所在的同一臺計算機上的 ,如何加載 機器的SQL服務器坐在 上等等。 底線 是,如果該連接開銷是 高,持久連接將幫助您 顯着。它們導致子進程在其整個生命週期中僅連接一次 ,而不是每次處理 要求連接到SQL服務器的頁面時,都會連接 。 這意味着對於每個打開 的持久連接的孩子,其 都有自己的連接到服務器的開放持久連接 。例如, 如果您有20個不同子進程運行的腳本使得 與您的SQL 服務器保持連接,則您將有20個不同的 連接到SQL服務器,每個子服務器有一個 連接。

但是請注意,這可以,如果你正在使用的數據庫 與被 通過持續的孩子 連接超過連接限制,有一些 缺點。如果您的數據庫有一個 限制爲16個併發連接, ,並且在繁忙的服務器會話過程中,17個子線程嘗試連接到 ,則無法連接。如果 在腳本中存在錯誤,其中 不允許連接關閉 (例如無限循環),那麼僅有16個連接的 數據庫可能會迅速淹沒()。檢查您的 數據庫文檔以獲取有關處理廢棄或空閒 連接的信息 。

4

基本上你必須平衡創建連接和保持連接的成本。儘管MySQL在建立新連接時速度非常快,但它仍然會花費 - 在線程安裝時間以及從Web服務器進行TCP/IP安裝的時間。這在高流量網站上顯而易見。不幸的是,PHP對連接的持久性沒有任何控制。所以答案就是在很長的時間內降低MySQL中的空閒超時時間(比如降低到20秒),並調高線程緩存大小。總的來說,這一般工作非常好。

另一方面,您的應用程序需要尊重連接的狀態。如果不使用臨時表,那麼使用CREATE IF NOT EXISTS和TRUNCATE TABLE會有很大幫助,並且可以爲它們唯一地命名(例如包括userid)。事務有點問題;但是您的代碼始終可以在頂部執行ROLLBACK,以防萬一。

+0

在較新版本的PHP比我寫的這個答覆,我發現,現在有調節池的大小設置。特別是,5.4.0有一個選項`mysqli.max_persistent`,它是PHP實例中連接池的最大大小。 PHP中的連接超時仍然沒有價值。 – staticsan 2016-06-03 00:41:02

3

mysql_connect()mysql_pconnect()兩者都可以用於數據庫連接,但幾乎沒有什麼區別。在mysql_pconnect()中,p代表持久性連接。

當我們使用mysql_connect()函數時,它每次都打開和關閉數據庫連接,具體取決於請求。

mysql_pconnect()功能的情況下:

  • 首先,連接時,該功能會嘗試找到一個(永久)連接這已經與同一主機,用戶名和密碼打開。如果找到一個,那麼它的標識符將被返回而不是打開一個新的連接。

  • 其次,當腳本執行結束時,不會關閉到SQL服務器的連接。相反,連接將保持開放供將來使用(mysql_close()將不會關閉由mysql_pconnect()建立的連接)。

mysql_pconncet()當您的網站上有大量的流量時非常有用。那時每個請求都不會打開連接,但會從池中取出。這會提高您網站的效率。但是對於一般的使用mysql_connect()是最好的。

+0

mysql_pconnect()是否更適合與mysqlnd一起使用? 「,函數將嘗試找到已經用相同的主機,用戶名和密碼打開的(持續)連接。」 - 我認爲這對mysqlnd更好用,或者我錯了? – consigliere 2016-02-16 03:53:11

0

mysql_connect()函數

1.mysql_connect可以用來關閉connection.Every時間它被打開和關閉的數據庫連接,這取決於該請求。

當頁面加載MYSQL連接

3.當加載頁面時,該數據庫被加載每次

4.It用來關閉連接2.Here打開數據庫時每次

實施例:

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

描述:

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

mysql_user:指定MySQL用戶名

mysql_password:指定MySQL的密碼

MYSQL_PCONNECT()

1.我們使用mysql_pconncet(),它最初試圖找到一個持久開放連接。

2. mysql_pconncet()打開連接持久

3. mysql_pconnect()不支持的密切聯繫

4.mysql_pconnect()不能關閉連接。這裏打開到數據庫的持久連接

5.這裏的數據庫不需要每次連接。

6.每次在mysql_pconncet()中都不需要連接數據庫。

更多細節:http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/