2011-02-14 31 views
4

我目前使用很多perl二進制散列文件存儲在多個文件位置用於加載數據到這個cgi網站。我在辯論如果我決定在那裏存儲數據,mySQL會更快還是更慢。訪問速度,perl二進制散列文件與mySQL

任何見解?我知道perl哈希完全加載到內存中。

戈登

+1

「二元散列文件」是什麼意思?你是否使用類似[DB_File](http://search.cpan.org/perldoc?DB_File)的連結哈希? – cjm 2011-02-14 22:49:56

+1

注意'開箱即用'MySQL通常對非常舊的硬件具有默認配置設置,並且可以大幅調整到高速緩存中大多數數據站點的位置。我正在查看我最近在deb6上安裝的mysql 5.1。開放評論「以下值假設你至少有32M RAM」!在線文檔稍微好一些,但仍然過了幾年:http://dev.mysql.com/doc/refman/5.0/en/server-parameters.html – dwarring 2011-02-14 23:40:59

+0

@snoopy:也許它是「幾年過時「是因爲你正在查看MySQL 5.0文檔。嘗試將URL從5.0更改爲5.5,以獲得更新的內容:http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html – 2011-02-15 10:21:39

回答

8

使用數據庫意味着你的查詢會慢一些,但你的腳本將使用較少的內存。

使用內存哈希表示您的查找速度會更快,但腳本將使用更多的內存。

如果你沒有內存問題,你的哈希將永遠不會變大,那麼繼續使用它們。

如果你沒有內存問題,並且你的哈希將變得更大,然後使用數據庫來看看。

如果您遇到內存問題,請使用數據庫。

如果你想使用數據庫爲了使用數據庫(即學習新技能),然後使用數據庫。

2

如果Perl哈希處理您的數據需求,那麼您可能不需要完整SQL數據庫的開銷。對於鍵值存儲有很多存儲選擇,例如Berkley DB和整個「NOSQL」運動。谷歌這些,你會發現很多信息。 CPAN中有很多Perl接口。

1

嚴格地講,就速度而言,在直接內存中哈希中找到單個完全匹配的密鑰與您可以獲得的一樣好,除非您的數據可以放入數組。 (即,它將僅由一系列數字鍵進行訪問,這些數字鍵形成從0開始的大部分連續範圍。)

如果您有多個可能需要搜索的鍵(例如,名稱和員工ID),或者如果您需要進行不完全基於平等的搜索(例如,「查找帶有姓氏的所有員工'Smith'」),那麼您將因搜索需求而顯着減慢散列鍵和數據庫開始看起來好多了。

整體性能的另一個因素是,你提到你的哈希是「存儲在多個文件位置」。如果你只做一個或幾個查找,那麼從這些文件中讀取哈希到內存中也需要花費時間,這又會傾向於使用數據庫,這將最大限度地減少從磁盤讀取的不需要的數據量。

因此,這取決於您需要如何訪問您的數據和訪問模式。

0

除了已經提到的內容之外,您將獲得數據庫的更多可擴展性,因爲它可以卸載到另一臺服務器。多年來,MySQL一直致力於更快速地進行復雜的查詢,這是您不必編寫的代碼。使用二進制散列,您可以擔心在不降低應用程序速度的情況下同步到磁盤,確保在多個進程一次訪問數據時確保磁盤寫入的原子性,維護和優化以及處理同步。使用數據庫爲您處理所有這些問題。

在等式的另一端,數據庫意味着額外的I/O延遲,因爲發送查詢並通過網絡或本地套接字接收結果。不要低估你可以在這裏度過的時間,特別是隨着你的數據集的增長。

在散列驅動程序上編寫通用API通常是一個好主意。然後,當可伸縮性或併發性成爲問題時,您可以添加MySQL驅動程序並遷移您的數據。誠然,這是一個很大的「公正」,但它是一種快速而簡單的方法,可以在需要更改時限制對軟件其餘部分的影響