MySQL MyISAM表文件现在太大
我有一个MySQL MyISAM表,用于处理中等Blob数据。现在它达到了1.09TB。我现在很担心。是否可以将此表拆分为多个文件?File.MYD01,File.MYD01,。。。等等 或者,如果你对另一条路有更好的想法,你会很乐意听到的 (从评论中添加:)MySQL MyISAM表文件现在太大,mysql,myisam,Mysql,Myisam,我有一个MySQL MyISAM表,用于处理中等Blob数据。现在它达到了1.09TB。我现在很担心。是否可以将此表拆分为多个文件?File.MYD01,File.MYD01,。。。等等 或者,如果你对另一条路有更好的想法,你会很乐意听到的 (从评论中添加:) 如果您的mysql安装支持它,您可以使用分区: 请提供显示创建表和显示表状态 长期以来,MyISAM数据大小的默认限制为2^48字节。对于索引,默认的FIXED格式为2^40行,这可能不是您的情况——因为您有一个MEDIUMBLOB 2^
如果您的mysql安装支持它,您可以使用分区:
请提供
显示创建表
和显示表状态
长期以来,MyISAM数据大小的默认限制为2^48字节。对于索引,默认的FIXED
格式为2^40行,这可能不是您的情况——因为您有一个MEDIUMBLOB
2^48可能是你唯一的限制;这是256TB。你离成功还有很长的路要走。进行合并
或分区
的痛苦可能不值得。您可能不会获得任何性能方面的好处
压缩建议
blob在加密之前是什么类型的数据?如果它是文本(或者更像文本而不是图像),您可以在加密之前对其进行压缩。这可能会将空间缩小3倍。(当然,只有在优化
或更改
表格后,才能收回空间。)
对该表的任何更改都至少需要足够的空间来保存该表的副本。如果可以同时进行压缩,则可能只需要400GB的额外磁盘空间。然后您可以删除1.09TB,只剩下400GB。1.09TB?哇!你存储的是什么?我存储的是加密的二进制Blob:(它将与MyISAM一起使用,但在Innodb和其他地方会有一些麻烦。但是不可能对现有数据集进行分区-你需要创建一个新的(分区的)表并复制数据。这可以在停机时间最少的情况下完成-查看Percona或Facebooks零停机模式更改脚本。@symcbean-InnoDB的“并发症”是什么?请参阅Percona的
pt online模式更改
。它确实涉及触发器
,并且需要足够的磁盘空间来额外复制表。@Rick:外键不起作用,你需要小心优化(这是我避开FKs的另一个原因)。下面是我的演示:为fileTBL创建表,创建表fileTBL
(fileID
int(11)非空自动增量,docID
int(11)非空,versionID
int(11)不为空,docCode
varchar(30)不为空,fileData
mediumblob,docSalt
varchar(1000)默认为空,主键(fileID
),键DocVersion
(versionID
,docID
)ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1I为了清晰起见,我将CREATE
移到了问题中。我添加了“压缩建议”对于我的答案,请看您的想法。加密前的文件是文档的PNG图像。是的,它在加密前也会被压缩。如果您没有额外的TB,您将无能为力。但可能没有“问题”;您还远远没有达到任何限制。
CREATE TABLE fileTBL (
fileID int(11) NOT NULL AUTO_INCREMENT,
docID int(11) NOT NULL,
versionID int(11) NOT NULL,
docCode varchar(30) NOT NULL,
fileData mediumblob,
docSalt varchar(1000) DEFAULT NULL,
PRIMARY KEY (fileID),
KEY DocVersion (versionID,docID)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1