我应该使用什么列数据类型来存储大量文本或html

时间:2011-03-28 11:33:36

标签: mysql sql database-design

我在表中有一个列,它在开头就是varchar(255),由于一些设计更改,现在它是varchar(1536)= 1024 + 512.我不会搜索或索引这个字段,是吗如果您希望针对性能优化此值,那么将此值存储在varchar以外的其他数据类型中是否有意义?

5 个答案:

答案 0 :(得分:85)

你应该像其他人一样使用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 :(得分:29)

是的,如果您可以将值存储在“TEXT”数据类型中会更好。有关详细信息,请阅读this article

有关存储要求的知识,您可以阅读this one

希望它有所帮助。

答案 2 :(得分:10)

您应该使用文件而不是数据库来存储它。尤其不是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,65535,16 MB和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,文本FROM Texttable中的WHERE id(...)以获取TEXT / BLOB值。这将使得使用'using temporary'的查询不使用TEXT或BLOB类型,然后您可以使用一个无需“使用临时”运行的简单查询来获取TEXT字段。

通过阅读http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/

,您可以了解有关MySQL TEXT和BLOB存储内部的更多信息

答案 3 :(得分:2)

我会将text用于可变长度的列。

答案 4 :(得分:1)

我在开发中陷入困境后来到这里。
在我的网站:
我在 MYSQL 中使用了 TEXT 数据类型来存储用户输入给出的 textarea 的内容。今天我在textarea中给出一个大文本(112KB)存储在DB中。 然后它坏了。
然后我从互联网上阅读-

<块引用>

TINYTEXT:255 个字符 - 255 个 B
文本:65,535 个字符 - 64 KB
MEDIUMTEXT:16,777,215 - 16 MB
LONGTEXT:4,294,967,295 个字符 - 4 GB

对我来说,我必须切换到MEDIUMTEXT