2009-12-18 40 views
2

查詢db時是否覺得非常偏執?每當需要完成一個新的查詢時,我都會打開和關閉mysql連接。我擔心(特別是在啓用了ajax的頁面中),這會導致性能下降。通過頁面打開mysql連接是否完全不顧一切?

我應該繼續使用這種方法,還是至少在每個頁面打開和關閉一次連接(而不是每個查詢)? (我正在寫php php btw)

謝謝。

回答

7

是的,每次連接的開銷都會很大。我建議你在完成後關閉它,但是如果僅僅打開一個連接而不運行查詢就不太可能會爲你帶來漏洞。

3

我推薦一個連接池,如果它可能與PHP。這是一種同時最大化性能和最小化連接時間的方法。

+1

雖然不是一個真正的連接池,但PHP可以通過mysql_pconnect()爲每個Apache worker維護一個持久連接。 – Matthew 2009-12-18 03:14:24

3

你應該不是馬上關閉MySQL連接。最好爲整個PHP腳本使用單個連接。如果不明確,PHP將自動關閉連接。

打開新的連接會導致一些小的時間損失,特別是如果MySQL駐留在網絡上的另一臺服務器上。新的TCP連接需要three-way handshake,每個TCP連接消耗at least two minutes的內核資源。

儘管PHP不支持完整的連接池,但程序化MySQL API確實支持持久連接。有關更多詳細信息,請參閱mysql_pconnect()。在我的辦公室,我們使用pconnect來避免在我們高流量的PHP網站上崩潰TCP堆棧。

0

考慮PHP數據對象,它可以爲你保持持久連接。你真的只用一次證書連接,然後緩存連接。創建的東西沿着這些線路的連接:

$dbh = new PDO('mysql:host=HOSTNAME;dbname=DBNAME', 'USER', 'PASSWORD', array(PDO::ATTR_PERSISTENT => true));

欲瞭解更多信息,請參閱this page PHP手冊。

0

無法爲PHP說話,但是當我寫這樣的事情在阿帕奇/ Perl中我一般做兩件事情來提高性能:

一)允許MySQL的處理,只要保持開放作爲Apache守護進程確實。 b)保持緩存的語句句柄(使用LRU緩存)。

在生產服務器上,這些MySQL句柄中的一些已經存在好幾天了,爲數千個相當複雜的SQL查詢提供服務。這不是問題。

+0

哦,我忘了提及:確保你提交或回滾你可能已經開始的任何事務。 – NickZoic 2009-12-18 04:03:54

相關問題