我在表中有一个列,它在开头就是varchar(255),由于一些设计更改,现在它是varchar(1536)= 1024 + 512.我不会搜索或索引这个字段,是吗如果您希望针对性能优化此值,那么将此值存储在varchar以外的其他数据类型中是否有意义?
答案 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)
答案 2 :(得分:10)
您应该使用文件而不是数据库来存储它。尤其不是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,65535,16 MB和4GB数据,另外受max_allowed_packet限制
大型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。