[英]Is it more performant to keep text fields within a MySql table row or in a separate table and join
[英]Performant mysql in-row text fields
為了便於討論,假設我試圖在MySQL表中表示一個非常簡單的文件系統。 請注意,這並不是我正在做的事情,它只是使問題簡單易懂。 因此,不要再告訴我存儲文件的更好方法。 該表的架構如下:
varchar path
varchar filename
blob content
上面的模式的問題在於,每當查詢不一定需要content字段時,它的性能就會很差,因為content字段可能很小。 例如,如果我想執行一個列出給定路徑中所有文件的查詢,MySQL引擎(為了讀取文件名字段)將把每一行讀入與where子句匹配的內存中。 這意味着該內容對於查詢來說是不必要的,但仍需要將其加載到內存中,這會影響性能。
解決此問題的典型方法是將內容移到始終由id直接訪問的單獨表中。 這種方法的麻煩在於它增加了插入和選擇的復雜性。 將內容直接附加到單個行不再是立即顯而易見的。
所以,我的問題(最終!)是這個。 有沒有一種方法可以將Blob保留在架構中,而導致MySQL僅在明確要求時才抓住它? 我想知道是否可以在列上放置備用存儲引擎或修飾符。 謝謝!
簡短的答案不是真的 (至少不是我見過的)。 表數據以特定的方式存儲在磁盤/內存中,訪問它總是會導致BLOB
內容的損失。
一種可能會加快速度的方法(可能已經或可能尚未就緒)會在path
和/或filename
上使用索引(如果您基於查詢的基礎)。 當然,無論索引優化如何,開始插入的數據越多,查詢開始的時間就越長。
我個人建議使用急於避免的解決方案。 這是一種常用的方法,實際上並沒有增加更多的復雜性。 它是一個附加的INSERT
語句,您可以使用JOIN
或第二個SELECT
語句來SELECT
數據。
關於“ 不再直接將內容直接附加到單個行 ”語句-您是設計系統的那個人,因此將內容附加到另一個表中的一行應該非常明顯。 如果您對表和列命名足夠,那么(希望)對在系統中工作的其他人也應該很明顯。 諸如files
(具有id
, path
和filename
)和file_contents
(具有file_id
, content
)之類的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.