php - 在将文本存储到数据库之前压缩文本

标签 php mysql compression archive

我需要在 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。我有充分的理由认为数字会以图表方式增加。我不想在文件中存储文本,因为逻辑很繁重,而且我的网站有很多点击量。

最佳答案

你要索引这些文本吗?这篇文章的阅读负荷有多大?插入负载?

您可以使用 InnoDB 数据压缩 - 透明且现代的方式。见 docs了解更多信息。

如果您有非常大的文本(例如,每个文本超过 10MB),最好不要将它们存储在 Mysql 中。将由 gzip 压缩的文本存储在文件系统中,仅在 mysql 中存储指针和元数据。您可以在将来轻松扩展您的存储并将其移动到例如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;

稍后您将需要使用 KEY_BLOCK_SIZE。请参阅 SHOW STATUS LIKE 'COMPRESS_OPS_OK'SHOW STATUS LIKE 'COMPRESS_OPS'。这两个参数的比率必须接近 1.0:Docs .

关于php - 在将文本存储到数据库之前压缩文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8228950/

相关文章:

php - 在 Eloquent ORM 中左加入 Where

php - SilverStripe GraphQL - 查询具有后代的类型时出错

sql - 优化我的 mysql 查询以使用索引进行排序

C# 将 TIFF JPEG 压缩转换为 TIFF CompressionCCITT4 会产生大量噪音

Mysql innodb 压缩没有给出正确的结果

php - 带有\x26 值的 JSON 破坏了 PHPs json_decode

php - 从 mysql 结果中打印 $variable

mysql - mysql使用什么样的哈希?

mysql - 如何将列名组合到 MySQL "LIKE"子句中

C# 只读第一行,使用压缩文本文件的 StreamReader