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

use*_*108 45 mysql sql database-design

我在一个表中有一个列,在开始时曾经是varchar(255),由于一些设计更改,现在它是varchar(1536)= 1024 + 512.我不会搜索或索引此字段,它是否有意义如果要优化此性能以将此值存储在varchar以外的其他数据类型中?

vbe*_*nce 91

您应该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
);
Run Code Online (Sandbox Code Playgroud)

每当您列出文章时,您都可以使用该article表格(作者33的最后5篇文章):

SELECT id, title FROM article WHERE author_id=33 ORDER BY created DESC LIMIT 5
Run Code Online (Sandbox Code Playgroud)

当有人真正打开文章时,您可以使用以下内容:

SELECT a.title, ab.body
FROM article AS a
   LEFT JOIN article_body AS ab ON ab.id = a.id
WHERE a.id=82
Run Code Online (Sandbox Code Playgroud)

  • +1 TEXT或BLOB:将它们从基本表中分离出来 (13认同)
  • 但是如果你把主体放在与其他数据相同的表中,并且使用上面的第一个SELECT查询只访问id和title时,这真的会减慢表的速度吗?我的意思是你在执行查询时没有读取任何正文. (4认同)
  • @Oskwish对于常见的字段类型,如`INT`,`VARCHAR`,`DATE`等,存储引擎将保留最大空间.例如,VARCHAR(100)将始终在记录中具有100个字节(+元信息).这样,可以计算常数**记录长度**,并且第n个记录将始终位于偏移量"n*记录长度". - 另一方面,为每个"TEXT"字段保留65536字节是非常浪费的,因此它会动态分配空间.在这种情况下,redord的大小不再固定,需要更多操作才能处理它们. (3认同)

Kno*_*ing 29

是的,如果您可以将值存储在" TEXT"数据类型中会更好.有关详细信息,请阅读此文章.

关于存储要求的知识,您可以阅读本文.

希望能帮助到你.


Iso*_*opp 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值.这将使"使用临时"的查询不使用TEXT或BLOB类型,然后您可以使用无需"使用临时"运行的简单查询来获取TEXT字段.

您可以通过阅读http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/了解有关MySQL TEXT和BLOB存储内部的更多信息.