在将文本存储在数据库中之前对其进行压缩

2022-08-30 23:03:01

我需要在mysql数据库中存储大量文本。这将是数百万条字段类型为LONGTEXT的记录,数据库大小将是巨大的。

所以,我想问一下,如果有一种安全的方法可以在将文本存储到TEXT字段之前压缩文本以节省空间,并在需要时将其提取回来?

像这样:

$archived_text = compress_text($huge_text);
// saving $archived_text to database here
// ...

// ...
// getting compressed text from database
$archived_text = get_text_from_db();
$huge_text = uncompress_text($archived_text);

有没有办法用php或mysql做到这一点?所有文本均采用 utf-8 编码。

更新

我的应用程序是一个大型文献网站,用户可以在其中添加他们的文本。这是我的表格:

CREATE TABLE `book_parts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `book_id` int(11) NOT NULL,
  `title` varchar(200) DEFAULT NULL,
  `content` longtext,
  `order_num` int(11) DEFAULT NULL,
  `views` int(10) unsigned DEFAULT '0',
  `add_date` datetime DEFAULT NULL,
  `is_public` tinyint(3) unsigned NOT NULL DEFAULT '1',
  `published_as_draft` tinyint(3) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `key_order_num` (`order_num`),
  KEY `add_date` (`add_date`),
  KEY `key_book_id` (`book_id`,`is_public`,`order_num`),
  CONSTRAINT FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

目前它有大约80万条记录,权重为4 GB,99%的查询是SELECT。我完全有理由认为数字在图表上增加。我不想在文件中存储文本,因为周围有相当沉重的逻辑,我的网站有很多点击。


答案 1

你要索引这些文本吗?这些文本的读取负载有多大?插入负载?

您可以使用InnoDB数据压缩 - 透明和现代的方式。有关详细信息,请参阅文档

如果你有真正的巨大文本(比如说,每个文本都超过10MB),那么好主意就是不要将它们存储在Mysql中。在文件系统中存储由gzip文本压缩的文本,并在mysql中仅存储指针和meta。你将来可以轻松扩展存储并将其移动到 DFS 等。

更新:在Mysql之外存储文本的另一个好处:DB保持小而快。减:数据不一致的概率很高。

更新2:如果您有很多编程资源,请看一下这样的项目:http://code.google.com/p/mysql-filesystem-engine/

最终更新:根据您的信息,您可以只使用InnoDB压缩 - 它与ZIP相同。您可以从以下参数开始:

CREATE TABLE book_parts
 (...) 
 ENGINE=InnoDB
 ROW_FORMAT=COMPRESSED 
 KEY_BLOCK_SIZE=8;

稍后,您将需要玩 .请参见和。这两个参数的比率必须接近 1.0:文档KEY_BLOCK_SIZESHOW STATUS LIKE 'COMPRESS_OPS_OK'SHOW STATUS LIKE 'COMPRESS_OPS'


答案 2

如果你正在压缩(例如gzip),那么不要使用任何类型的TEXT字段。它们不是二进制安全的。进入/流出文本字段的数据需要字符集转换,这可能会(尽管不一定)破坏压缩的数据,并在检索/解压缩文本时为您提供损坏的结果。

请改用 BLOB 字段,这些字段是二进制透明的,不会对数据进行任何转换。


推荐