我在表中有一列曾經是varchar(255)在開始,由於一些設計更改現在它是varchar(1536)= 1024 + 512.我不會搜索或索引這個字段,如果你想優化這個性能的話,把這個值存儲在不同於varchar的數據類型中是否有意義?我應該使用什麼列數據類型來存儲大量的文本或html
回答
我會使用text
作爲可變長度的列。
您應該使用文件,而不是數據庫來存儲它。尤其不是MySQL。我曾經做過一次解釋,說明如果您將圖像從數據庫BLOB中下載,請參閱http://mysqldump.azundris.com/archives/36-Serving-Images-From-A-Database.html。使用文件,您可以使用sendfile(2)系統調用來使用Web服務器的快速路徑,並且使用它更快。
MySQL也沒有BLOB API。這意味着,上傳或下載大於max_allowed_packet的對象是不可能的,並且使用SUBSTRING()很難解決這個問題,因爲這會在服務器內存中造成不必要的字符串副本。
如果您絕對必須在服務器中存儲BLOB或TEXT數據,您可以選擇TINYTEXT,TEXT,MEDIUMTEXT和LARGETEXT,這些數據僅限於服務器中的255,66535,16MB和4GB數據,此外還受到max_allowed_packet的。
大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/
「大BLOB或T EXT信息將徹底破壞您桌子上的數據密度。「即使您只使用列來存儲2kb的數據,這是否正確? – 2011-03-28 11:55:20
它取決於InnoDB格式(見最後的mysqlperformanceblog鏈接)。但假設您將2KB TEXT和64字節的其他數據放入16 KB InnoDB頁面。留下5-6行/塊,而不是數百。如果您搜索非blob數據,速度非常慢。這就是BLOB存儲在InnoDB(Barracuda ROW_FORMAT = DYNAMIC)的後續版本中改變的原因,本質上是在內部自動構建這樣一個外部表。 – Isotopp 2011-03-28 11:58:54
您應該使用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
+1 TEXT or BLOB:decouple them form your basic table – 2012-06-27 08:02:32
但是,如果您將主體與其他數據放在同一個表中,並且在使用上面的第一個SELECT查詢訪問id和標題時,是否真的減慢了表格的速度?我的意思是在執行查詢時不會讀取任何正文文本。 – 2012-12-15 19:35:49
@Oskwish對於像'INT','VARCHAR','DATE'等常見字段類型,存儲引擎將保留最大空間。例如,VARCHAR(100)在記錄中總是有100個字節(+ meta info)。這樣就可以計算一個常數**記錄長度**,並且第n條記錄總是在偏移量'n *記錄長度'處。 - 另一方面,爲每個「TEXT」字段保留65536字節是非常浪費的,因此它動態分配空間。在這種情況下,redord的大小不再固定,需要更多的操作來處理它們。 – vbence 2012-12-16 07:42:22
- 1. 我應該使用什麼數據類型來存儲文本數據?
- 2. 應該使用什麼MySQL數據類型和屬性來存儲大量的html格式數據?
- 3. 我應該使用哪種列類型來存儲未知大小的HTML?
- 4. 我應該使用什麼數據類型來存儲小的十進制值
- 5. 我應該使用什麼VHDL數據類型來存儲地址?
- 6. 我應該使用什麼數據類型來存儲base64字符串?
- 7. 我應該使用什麼SQL Server數據類型來存儲字節[]
- 8. 我應該使用什麼樣的數據模型來存儲歷史數據?
- 9. 我應該使用什麼數據庫來存儲大量可能較大的嵌套散列結構?
- 10. 我應該使用什麼數據類型在覈心數據中存儲GUID?
- 11. 我應該使用什麼mysql數據類型來加密文本?
- 12. 我應該使用什麼類型的數據庫模式來存儲和使用地理位置數據?
- 13. 我們應該使用什麼類型的NoSQL存儲?
- 14. 我應該在Android中使用什麼類型的數據存儲?
- 15. 我應該使用什麼類型的數據結構來保存錶行?
- 16. 我應該使用什麼樣的數據結構來存儲文件庫..?
- 17. 我應該使用什麼數據類型來存儲MySQL數據庫中的U.S狀態?
- 18. 我應該使用什麼數據結構來存儲.fasta頭文件集合?
- 19. 我應該使用什麼標籤來存檔文件大小?
- 20. 我應該用什麼正確的類型來存儲最新的日期?
- 21. 我應該使用什麼類型的數據庫?
- 22. 我應該使用什麼類型的數據庫複製?
- 23. 我應該使用什麼數據結構來存儲不同類型的對象
- 24. 應該使用哪種PostgreSQL列類型來存儲Java BigDecimal?
- 25. 應該使用什麼列類型將序列化數據存儲在mysql數據庫中?
- 26. 什麼時間數據類型,我應該使用
- 27. 我應該使用redis來存儲大量的二進制文件嗎?
- 28. 我應該使用什麼結構來存儲這些對象?
- 29. 我應該使用什麼樣的數據結構來處理大數據
- 30. 爲Android應用本地或在線存儲大量數據?
這應該解決的問題 - https://stackoverflow.com/questions/9322569/whats-the-best-way-to-store-html-code-in-mysql – venky 2017-08-05 15:04:20