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)
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_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值.这将使"使用临时"的查询不使用TEXT或BLOB类型,然后您可以使用无需"使用临时"运行的简单查询来获取TEXT字段.
您可以通过阅读http://www.mysqlperformanceblog.com/2010/02/09/blob-storage-in-innodb/了解有关MySQL TEXT和BLOB存储内部的更多信息.