Sil*_*ght 12 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);
Run Code Online (Sandbox Code Playgroud)
有没有办法用php或mysql做到这一点?所有文本都是utf-8编码的.
UPDATE
我的应用程序是一个大型文献网站,用户可以在其中添加文本.这是我的表:
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
Run Code Online (Sandbox Code Playgroud)
目前它有大约800k记录和4 GB的权重,99%的查询是SELECT.我有理由认为数字会以图形方式增加.我不想在文件中存储文本,因为周围有很重的逻辑,我的网站有很多点击.
Oro*_*102 14
你打算索引这些文本吗?这篇文章的读取负载有多大?插入负载?
您可以使用InnoDB数据压缩 - 透明和现代的方式.有关详细信息,请参阅文档.
如果你有真正的大文本(比方说,每个文本大于10MB),那么好的想法就是不要将它们存储在Mysql中.存储在文件系统中的gzip文本压缩,只有mysql中的指针和元素.您可以在将来轻松扩展存储并将其移至例如DFS.
更新:在Mysql外部存储文本的另一个好处:数据库保持小而快.减:数据不一致的概率很高.
更新2:如果你有很多编程资源,请看看这样的项目:http://code.google.com/p/mysql-filesystem-engine/.
最终更新:根据您的信息,您可以使用InnoDB压缩 - 它与ZIP相同.你可以从这些参数开始:
CREATE TABLE book_parts
(...)
ENGINE=InnoDB
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8;
Run Code Online (Sandbox Code Playgroud)
稍后你需要玩KEY_BLOCK_SIZE.见SHOW STATUS LIKE 'COMPRESS_OPS_OK'和SHOW STATUS LIKE 'COMPRESS_OPS'.这两个参数的比率必须接近1.0:Docs.
如果您正在压缩(例如gzip),则不要使用任何类型的TEXT字段.它们不是二元安全的.进出文本字段的数据受字符集转换的影响,这可能(但不一定)破坏压缩数据并在检索/解压缩文本时给出损坏的结果.
请改用BLOB字段,这些字段是二进制透明的,不对数据进行任何转换.
小智 6
将文本字段定义为blob可能更好,并在PHP中压缩数据以节省通信成本.
CREATE TABLE book_parts (
......
content blob default NULL,
......
)
Run Code Online (Sandbox Code Playgroud)
在PHP中,使用gzcompress和gzuncompress.
$content = '......';
$query = sprintf("replace into book_parts(content) values('%s') ",
mysql_escape_string(gzcompress($content)) );
mysql_query($query);
$query = "select * from book_parts where id = 111 ";
$result = mysql_query($query);
if ($result && $row = mysql_fetch_assoc($result))
$content = gzuncompress($row['content']);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20408 次 |
| 最近记录: |