2008-11-02 42 views
1

我正在構建英文網絡詞典,用戶可以在其中鍵入單詞並獲取定義。我想了一會兒,因爲數據是100%靜態的,而且我一次只檢索一個單詞,我最好使用文件系統(ext3)作爲數據庫系統,而不是選擇使用MySQL來存儲定義。考慮到你必須連接到MySQL,而且本身是一個非常緩慢的操作,我認爲會有更少的開銷。使用文件系統VS RDMBS進行併發處理(MySQL)

我的恐懼是,如果我的系統受到轟炸,比如說500個字的檢索次數/秒,我仍然會更好地使用文件系統作爲數據庫嗎?或者增加的文件系統讀取會妨礙性能,而不是MySQL可能在底層做的事情?

當前層次結構按單詞的第一個字母,第二個字母和第三個字母分段。因此,如果您要搜索「水」的定義,腳本(PHP)將嘗試從「../dict/w/a/t/water.word」中讀取(在清理了有問題的字符和降低它)

我正在朝着正確的方向嗎?還是有更快的解決方案(不包括使用類似memcached的內存存儲定義)?在任何目錄因素中存儲的文件數量是否會影響性能?我應該存儲在一個目錄中的文件數量的基準是多少?

回答

1

字典需要的查找類型正是數據庫擅長的。我認爲你描述的文件系統方法是行不通的。不要太難!使用數據庫。

0

數據庫聽起來非常適合您的需求。 我也不明白爲什麼memcached是相關的(你的數據有多大?不能超過幾個GB ...對吧?)

1

你可以保持一個連接池來加速連接到D B。

此外,如果此應用程序需要擴展到多個服務器,則文件系統在服務器之間共享可能會非常棘手。

所以,我第三個建議。使用數據庫。

但除非它是一個令人難以置信的大字典,緩存將意味着你幾乎alwys正從本地存儲的東西,所以我不認爲這會成爲你的應用程序:)

0

的最大的問題數據大約是幾GB。我的目標是速度,速度和速度(定義將使用XHR加載)。我說的數據是靜態的,永遠不會改變,並且在任何情況下,我都不會爲每個請求使用除單個讀取操作之外的任何內容。所以我很難確信使用MySQL及其所有的膨脹。

使用這種策略,文件系統或MySQL會在高負載下首先失敗嗎?至於縮放複製是答案,因爲數據永遠不會改變,只有幾GB。

2

您認爲該決定對解決方案的整體性能有影響的理由是什麼?它除了提供定義之外還有什麼作用?

無論如何你是否有MySQL作爲解決方案的一部分,或者如果你選擇它作爲解決方案,你需要添加它嗎?

定義的權威來源在哪裏? (可能是複製的)文件系統或脫機DB?

看來喜歡的事,應該是在一個數據庫體系結構 - 文件系統是一個陌生的地方來映射大量名目的值

(這是由你的文件系統結構摔東西下降首字母證明)如果它在數據庫中,回答問題如「有多少個定義?」要容易得多,但如果你不關心你的應用程序的這種情況,這可能無關緊要。

因此,在某種程度上,這種感覺好像在尋求對性能不會對整體解決方案產生太大影響的性能進行超級優化。

我是「讓它正確,然後快速」的粉絲,「正確」將更直接地用數據庫來實現。

當然,最終的答案是嘗試兩種方式,看看哪一種最適合您的情況。

Paul

0

讓它工作第一。過早優化是不好的。

使用數據庫可以更輕鬆地重構模式,而且您不必編寫基於索引的查找的實現,而實際上這種查找實際上並不重要。

說連接數據庫「是一個非常緩慢的操作」誇大了問題。實際上,連接不需要很長時間,而且您可以重複使用連接。

如果您擔心讀取縮放,1G數據庫非常小,因此您可以將它的只讀副本推送到每個Web服務器,並且它們都可以從其本地副本讀取。只要寫入保持在不影響讀取性能的級別,即可提供幾乎完美的可讀性。另外,1G的數據很容易放入ram中,所以你可以在啓動時將整個數據庫加載到內存中(在該節點通告負載均衡器之前),從而使其速度更快。

每秒500次查詢非常小。也許,我會開始擔心每個服務器每秒5000個。如果你不能在現代硬件上實現每秒5000次密鑰查找(從一個適合於RAM的數據庫?!!),那麼你的實現會出現嚴重錯誤。

0

同意這是不成熟的優化,並且MySQL對於這種用例肯定會有足夠的性能。我必須補充你也可以使用基於文件的數據庫,就像非常快速的Tokyo Cabinet作爲妥協。可悲的是,它沒有PHP綁定,所以你可以使用它的祖父DBM

也就是說,不要使用文件系統,就我所見,沒有什麼好的理由。

0

在您的內存中使用虛擬驅動器(谷歌它如何爲您的發行版),或者如果您的數據是由PHP提供的使用APC,memcache可能與MySQL工作。就我個人而言,我不認爲你在這裏做的優化是你應該花費時間的地方。 500秒的請求量非常大,我認爲使用mysql可以爲您提供更好的後續功能。如果你想讓自己與競爭對手脫穎而出,我認爲你需要專注於功能,而不是速度。另外還有一些關於網絡用戶界面的好消息,服務器速度只是整個圖片的一小部分。

好運

0

你也可以想想一個沒有SQL數據庫(如了Riak,蒙戈,甚至Redis的)這樣的事情。它們都非常快,並且可以幫助您進行復制。在這種情況下,Mysql可能會被過度殺死並且難以擴展,但其他的則有一些強大的工具