2014-02-13 190 views
1

我有一個具有100K行的單個表DB。大約有30列,其中28個是varchars/tiny文本,其中一個是int主鍵,其中一個是blob。MySQL數據庫規範化

我的問題,就性能而言,將blob與表的其餘部分分開並將它們存儲在自己的表中並將外鍵約束保存到主ID,會更好嗎?

該表最終將變成一個用於iOS核心數據的sqlite持久性存儲,並且將根據輕量級varchar列的NSPredicate完成大量搜索/篩選。

對不起,如果這太主觀,但我想有一個推薦的方法。

謝謝!

+1

數據庫規範化與數據類型無關。如果每行只有一個blob項目,它所在的表格可能是最適合的。 –

+0

如果你有大量的blob數據,它最有可能是將它存儲在文件中的最好方式,並且在數據庫內部有路徑。 –

+0

這是爲什麼用mysql標記的? – Holly

回答

1

這完全取決於數據的使用情況。

如果您每次查詢表時都需要數據,那麼在單獨的表中就沒有區別(只要blob數據在每一行中都是唯一的 - 即「只要數據庫被標準化」 )。

如果你不需要blob數據,但只需要來自其他列的元數據,那麼可能會有速度獎金qhen查詢blob是否有自己的表。查詢blob數據的速度較慢,因爲您需要查詢bowth表。

USUAL方式不是將任何blob數據存儲在數據庫中(至少不是大數據),而是將二進制數據存儲到文件中,而是在數據庫內部具有域路徑。這是推薦的,因爲二進制數據很可能不會受益於DBMS內部(不可索引,可排序,可分組等),所以不存在將其存儲在文件內的缺點,而數據庫未針對二進制進行優化數據(因爲,無論如何,它不能做太多)。

+0

我不同意這種「通常」的方式。雖然它適用於本地應用程序,但在開發基於服務器的系統時,必須處理與數據庫一起維護文件系統的單獨安全性和訪問權限通常會使該選項的吸引力降低。 –

+0

@GordonLinoff這真的取決於。基於Web的應用程序,只有你和可能的一些受信任的開發人員才能訪問服務器,設置適當的訪問權限不應該太過分。 –

+0

雅,blob數據不是二進制的,它的文本blob。最可能的矯枉過正,但是當我捕獲數據時,我不知道會發生什麼。能夠被搜索並且最終可能想考慮使用solr來索引它是很好的,但現在,它的每個blob大約有5kb的文本。將它存儲在單個文件中對我來說太多了,因爲我不希望iOS上的文件開銷或管理問題。 – 4m1r

0

Blob存儲在磁盤上只存儲在Mysql中的內存中。使用外鍵將它移動到另一個表格不會顯着幫助您的表現。不知道這是否是sqlite的情況。

2

如果你做SELECT * FROM table(如果你實際上不需要BLOB字段,你不應該這樣做),那麼是的,查詢將會更快,因爲在這種情況下,帶有BLOB的頁面將不會被觸及。

如果您經常使用SELECT f1, f2, f3 FROM table(所有字段都是非BLOB),那麼是的,將BLOBS存儲在一個單獨的表中將會使查詢更快,原因相同 - MySQL將不得不讀取較少的頁面。

但是,如果經常選擇BLOB,那麼單獨保留BLOB是沒有意義的。

+0

有趣,謝謝。只有在用戶從Master - > Detail視圖請求blob數據時才需要blob。所以很少。 – 4m1r

+0

然後你應該實際分割它。 –

+0

另外一個我忘記提及的時刻。 如果一條記錄小於7kB,那麼BLOB將被存儲在索引頁中。如果時間更長 - 索引頁中只存儲了前768個字節(如果梭子魚格式爲20個),則剩下的部分進入外部頁面。 因此,如果您的BLOB長度超過7kB,那麼分割表格也許沒有意義。梭子魚 - 當然。使用羚羊 - 取決於768個字節與記錄中的其他字段進行比較的大小。 – akuzminsky