2011-03-28 74 views
36

我在表中有一列曾經是varchar(255)在開始,由於一些設計更改現在它是varchar(1536)= 1024 + 512.我不會搜索或索引這個字段,如果你想優化這個性能的話,把這個值存儲在不同於varchar的數據類型中是否有意義?我應該使用什麼列數據類型來存儲大量的文本或html

+0

這應該解決的問題 - https://stackoverflow.com/questions/9322569/whats-the-best-way-to-store-html-code-in-mysql – venky 2017-08-05 15:04:20

回答

23

是的,如果可以將值存儲在「TEXT」數據類型中,則會更好。欲瞭解更多詳情,請閱讀this article

關於存儲要求的知識,您可以閱讀this one

希望它有幫助。

2

我會使用text作爲可變長度的列。

8

您應該使用文件,而不是數據庫來存儲它。尤其不是MySQL。我曾經做過一次解釋,說明如果您將圖像從數據庫BLOB中下載,請參閱http://mysqldump.azundris.com/archives/36-Serving-Images-From-A-Database.html。使用文件,您可以使用sendfile(2)系統調用來使用Web服務器的快速路徑,並且使用它更快。

MySQL也沒有BLOB API。這意味着,上傳或下載大於max_allowed_pa​​cket的對象是不可能的,並且使用SUBSTRING()很難解決這個問題,因爲這會在服務器內存中造成不必要的字符串副本。

如果您絕對必須在服務器中存儲BLOB或TEXT數據,您可以選擇TINYTEXT,TEXT,MEDIUMTEXT和LARGETEXT,這些數據僅限於服務器中的255,66535,16MB和4GB數據,此外還受到max_allowed_pa​​cket的。

大BLOB或TEXT信息將完全破壞表中的數據密度。創建與BLOB表的仿真1:1或1:0關係非常有用,然後將Blob存儲在此額外的表中。

當MySQL顯示'使用tempoary'的查詢計劃時,這意味着服務器在交付結果之前需要實現服務器中的結果集表。如果可能的話,這是使用MEMORY表完成的。任何TEXT或BLOB類型都不能在MEMORY表中表示,因此臨時表會將該磁盤作爲MyISAM表訪問。

您需要掃描這樣的查詢計劃,並將它們轉換爲加載BLOB/TEXT值的ID值的東西。在第二個查詢中,您將使用SELECT id,text()中的texttable WHERE id來獲取TEXT/BLOB值。這將使得使用'using temporary'的查詢不使用TEXT或BLOB類型,並且可以使用不使用'臨時'運行的普通查詢來獲取TEXT字段。

您可以瞭解更多關於MySQL TEXT和BLOB存儲的內部通過讀取http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

+0

「大BLOB或T EXT信息將徹底破壞您桌子上的數據密度。「即使您只使用列來存儲2kb的數據,這是否正確? – 2011-03-28 11:55:20

+0

它取決於InnoDB格式(見最後的mysqlperformanceblog鏈接)。但假設您將2KB TEXT和64字節的其他數據放入16 KB InnoDB頁面。留下5-6行/塊,而不是數百。如果您搜索非blob數據,速度非常慢。這就是BLOB存儲在InnoDB(Barracuda ROW_FORMAT = DYNAMIC)的後續版本中改變的原因,本質上是在內部自動構建這樣一個外部表。 – Isotopp 2011-03-28 11:58:54

74

您應該使用TEXT像其他人說,但有一些重要的建議每次使用TEXT或BLOB時間:去耦形成您的基表,因爲他們真的放慢訪問表。想象一下以下結構:

CREATE TABLE article (
    id INT(10) UNSIGNED, 
    title VARCHAR(40), 
    author_id INT(10) UNSIGNED, 
    created DATETIME, 
    modified DATETIME 
); 

CREATE TABLE article_body (
    id INT(10) UNSIGNED, 
    body TEXT 
); 

每當你列出的文章,你可以使用article表(筆者33的最後5篇):

SELECT id, title FROM article WHERE author_id=33 ORDER BY created DESC LIMIT 5 

當有人真正打開你的文章可以使用類似:

SELECT a.title, ab.body 
FROM article AS a 
    LEFT JOIN article_body AS ab ON ab.id = a.id 
WHERE a.id=82 
+11

+1 TEXT or BLOB:decouple them form your basic table – 2012-06-27 08:02:32

+3

但是,如果您將主體與其他數據放在同一個表中,並且在使用上面的第一個SELECT查詢訪問id和標題時,是否真的減慢了表格的速度?我的意思是在執行查詢時不會讀取任何正文文本。 – 2012-12-15 19:35:49

+3

@Oskwish對於像'INT','VARCHAR','DATE'等常見字段類型,存儲引擎將保留最大空間。例如,VARCHAR(100)在記錄中總是有100個字節(+ meta info)。這樣就可以計算一個常數**記錄長度**,並且第n條記錄總是在偏移量'n *記錄長度'處。 - 另一方面,爲每個「TEXT」字段保留65536字節是非常浪費的,因此它動態分配空間。在這種情況下,redord的大小不再固定,需要更多的操作來處理它們。 – vbence 2012-12-16 07:42:22

相關問題