2010-02-11 54 views
6

我工作的一個PHP的內容管理系統,並在測試中,已經注意到相當多的系統的MySQL表的幾乎每一頁查詢上,而是很少寫至。我想知道的是,隨着網站流量的增加,這會開始嚴重影響數據庫,我該如何解決/防止這種情況?在一個文件中存儲經常訪問的數據,而不是MySQL的

我最初的想法是啓動存儲一些文件(使用PHP序列)的多個靜態的數據,但是,這實際上降低服務器負載?我擔心的是我只是將高負載從數據庫傳輸到文件系統!

如果有人能告訴我更好的方法,那就太好了。 (皮膚

  • 國家的完整列表(包括ISO國家代碼)
  • 網站選擇:如果數據本身的體積也有很大的影響,我已經詳細一些數據,我會在下文中存儲,管理電子郵件,支持URL等)
  • 羣組(包括權限)

回答

13

你要記住,從數據庫中一個強大的服務器上,並在快速連接讀取表可能比從磁盤讀取它放在你的本地更快機。數據庫將把這些小的,經常訪問的表全部緩存在內存中。

自己在文件系統中實現相同的功能,只有一個小的可能加快,但一個巨大的機會搞砸了,並使其更慢。

這可能是最好的堅持使用數據庫。

+1

很酷,謝謝。我認爲我應該繼續使用MySQL是非常一致的! – Rowan 2010-02-11 08:53:59

2

數據庫是在處理大量數據比本地文件系統要好得多。

不要擔心優化您的網站以減少服務器負載,直到您真的有服務器負載問題。 :-)

1

如果您的數據庫被正確編入索引,從數據庫查詢數據將更快。如果你想加快速度,看看memcached或類似的。

2

你提到的(國家和用戶)表通常會在內存中的MySQL緩存直接除非你期待相當多的數以百萬計的這些表中的記錄。

在情況下這些表將不適合在內存中,你可能要考慮一個通用分佈式內存緩存系統,如memcached

5
  1. 優化您的查詢(使用mysql慢查詢日誌)和EXPLAIN函數。

  2. 如果表格確實很少寫入,則可以使用本機MySQL緩存。你的代碼中沒有什麼可以改變,只需在my.conf中啓用mysql緩存即可。

  3. 嘗試使用像Smarty(smarty.net)這樣的模板引擎。它有它自己的緩存系統,運行得非常好,並且會真正減少服務器負載。

  4. 你也可以使用內存緩存,但它僅使用具有非常高負載的網站真的值得。 (我認爲Smarty的將是足夠的。)

+1

肯定檢查mysql緩存,如果經常進行相同的查詢,它可以保留在ram中,這比任何文件系統都好。總是讓專業人員做這種事情。 – Karl 2010-02-11 00:17:43

+0

最好使用模板引擎,它只是將模板編譯爲純PHP,並讓數據庫完成工作 – 2010-02-11 00:20:36

1

數據庫正是爲此目的而存儲和提供數據。文件系統用於腳本和編程。

如果遇到加載問題,請考慮將Memcached或其他實用程序用於數據庫。

您也可以考慮嘗試將網頁的緩存不同部分直接進入數據庫作爲一個整體的部分(如側欄,這並沒有改變太多,生成的頭節,..)

+0

我不認爲把一些生成的HTML添加到數據庫是個好主意(是的,它有時很好,但取決於)。最好的方法是在磁盤上緩存生成的部分(請參閱我的答案)。 – Kirzilla 2010-02-11 00:14:09

+0

這取決於..有時候最好利用數據庫及其內部緩存(+ memcache),有時最好在APC或其他加速器的幫助下使用文件系統。我同意Mark Byers的回答,使用數據庫是一個安全的賭注 – 2010-02-11 00:17:59

0

你可以將輸出(flush(),ob_flush()等)緩存到一個文件中,而不是具有多個MySQL讀取。緩存確實比訪問MySQL多次更快。

讀取靜態文件比通過php和mysql處理增加開銷要快得多。

0

您需要通過負載測試來評估性能,以避免prematurely optimising

這將是愚蠢的,很可能會增加將數據存儲在序列化文件中的整體負載,數據庫非常擅長檢索數據。

如果經過分析後有真正的性能下降(我懷疑除非你正在談論大量加載),那麼緩存是一個更好的解決方案。

有一個設計良好的系統可以根據需要進行更改,這一點更爲重要。

0

這裏有一對夫婦腳本,將主要做什麼dusoft在談論和緩存輸出緩衝到文件的鏈接:

http://www.addedbytes.com/articles/caching-output-in-php/

使用這種方式,它更多的螺栓導通事後類型的解決方案,但如果在此過程中提前考慮,這種相同的行爲當然可以以更綜合的方式實施。許多框架也有內置這種東西。

相關問題