我应该使用什么列数据types来存储大量的文本或HTML
我有一个表中的列在过去是varchar(255)在开始,由于一些devise更改现在是varchar(1536)= 1024 + 512.我不会search或索引此字段,是否有意义要将此值存储在除varchar以外的其他数据types中,如果您想优化性能?
是的,如果可以将值存储在“ TEXT
”数据types中,则会更好。 欲了解更多详情,请阅读这篇文章 。
关于存储需求的知识,你可以阅读这个 。
希望能帮助到你。
你应该像其他人说的那样使用TEXT
,但是每次使用TEXT或者BLOB时都有一些重要的build议: 把它们分解成你的基表,因为它们真的放慢了访问表的速度。 想象一下下面的结构:
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
表(最后5条作者33):
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
你应该使用一个文件,而不是一个数据库来存储这个。 特别是不是MySQL。 我曾经写过一篇文章,解释如果您将数据从数据库BLOB中下载,请参阅http://mysqldump.azundris.com/archives/36-Serving-Images-From-A-Database.html 。 使用文件,可以使用sendfile(2)系统调用使用Web服务器的快速path,使用这个快速path要快得多。
MySQL也没有BLOB API。 这意味着,上传或下载大于max_allowed_packet的对象是不可能的,而且使用SUBSTRING()很难解决这个问题,因为这会在服务器内存中产生不必要的string副本。
如果您绝对必须将BLOB或TEXT数据存储在服务器中,则可以selectTINYTEXT,TEXT,MEDIUMTEXT和LARGETEXT,这些数据在服务器中限制为255,65535,16 MB和4GB数据,另外还受max_allowed_packet限制。
大的BLOB或TEXT信息将完全破坏您表中的数据密度。 创build与BLOB表的仿真1:1或1:0关系非常有用,然后将Blob存储在这个额外的表中。
当MySQL显示一个“使用tempoary”的查询计划时,这意味着服务器在交付结果之前需要实现服务器中的结果集表。 如果可能,这是使用MEMORY表完成的。 任何TEXT或BLOBtypes都不能在MEMORY表中表示,因此临时表会将该磁盘作为MyISAM表访问。
您需要扫描这样的查询计划,并将其转换为加载BLOB / TEXT值的ID值的东西。 在第二个查询中,你可以使用SELECT id,text(…)中的texttable WHERE id来获取TEXT / BLOB值。 这将使得使用“使用临时”的查询不使用TEXT或BLOBtypes,并且可以使用不使用“临时”运行的普通查询来获得TEXT字段。
您可以通过阅读http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/了解更多关于MySQL TEXT和BLOB存储的内部信息。
我会用可变长度的列的text
。