簡體   English   中英

高性能mysql行文本字段

[英]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 (具有idpathfilename )和file_contents (具有file_idcontent )之類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM