2012-10-03 40 views
2

爲了說明問題,我們假設我試圖在MySQL表中表示一個非常簡單的文件系統。請注意,這不是我正在做的事情,它只是爲了解決這個問題的簡單基礎。所以不要打擾告訴我更好的存儲文件的方式。該表的架構如下:高性能mysql行內文本字段

varchar path 
varchar filename 
blob content 

上面的架構麻煩的是,它也有壞的表現,每當查詢並不一定需要的內容領域,由於內容領域可能是安靜的大。例如,如果我想執行一個列出給定路徑中的所有文件的查詢,MySQL引擎(爲了讀取文件名字段)將把每行讀入匹配where子句的內存。這意味着這個查詢不需要的內容仍然需要加載到內存中,這會損害性能。

典型的解決這個問題是將內容移動到其總是由ID直接訪問的單獨的表。這種方法的麻煩在於它增加了插入和選擇的複雜性。直接將內容直接附加到單個行中不再是顯而易見的。

所以,我的問題(終於!)是這樣的。有沒有辦法將BLOB留在模式中,但導致MySQL只有在特別要求時才抓住它?我想知道是否有可以放置在列上的備用存儲引擎或修飾符。謝謝!

回答

1

簡短的回答是不是真的(至少不是我見過)。表格數據以特定的方式存儲在磁盤/內存中,訪問它總是會招致您的BLOB內容的處罰。

如果您對這些查詢進行了大量查詢,則可以使用path和/或filename上的索引來幫助加快速度,這可能已經或可能不會到位。當然,開始插入的數據越多,查詢將開始執行的時間越長,而不管索引優化如何。

我個人而言,建議與你渴望避開解去。這是一個經常使用的方法,實際上並沒有增加更多的複雜性。這是一個額外的INSERT聲明,你可以SELECT使用JOIN,或第二SELECT聲明中的數據。

關於「不再明顯,在內容直接連接到單行」語句 - 你是一個設計系統,所以它應該是非常明顯,內容附到另一個表中的一行。如果您充分地指定了表和列,那麼對於在系統中工作的其他人也應該(有希望)顯而易見。諸如files(具有idpathfilename)和file_contents(具有file_id,content)。