【问题标题】:Why compressed blob values don't change sqlite database size?为什么压缩的 blob 值不会改变 sqlite 数据库大小?
【发布时间】:2014-06-11 13:10:51
【问题描述】:

我有一个.sqlite 数据库

$db = new PDO("sqlite:db.sqlite");

大小为 60MB。它有 1 张桌子。此表列之一(唯一的重列)包含BLOB_TEXT 数据。我正在尝试压缩此列值

$pdo = $db->query("SELECT id, house_plan FROM houses");
$houses = $pdo->fetchAll(PDO::FETCH_ASSOC);
$initial_length = 0;
$compressed_length= 0;

for ($i = 0; $i < count($houses); $i++) {
  $id = $houses[$i]["id"];
  $house_plan = $houses[$i]["house_plan"];
  $compressed = gzcompress($house_plan);

  $initial_length += strlen($house_plan);
  $compressed_length += strlen($compressed);
  flush();

  $query = $db->prepare("UPDATE houses SET house_plan=? WHERE id=" . $id);
  $query->bindParam(1, $compressed, PDO::PARAM_LOB);
  $query->execute();
}

然后打印相加的初始BLOB_TEXT数据长度和压缩数据长度(替换了表中的初始数据):

echo "Before: " . $initial_length . ", After: " . $compressed_length;
// Before: 52222553, After: 2577948

以及它们的百分比差异:

echo "Difference: " . (100 - round($compressed_length / $initial_length * 100)) . "%";
// Difference: 95%

之后我检查了数据库的大小,仍然是 60MBBLOB_TEXT数据相差95%,但数据库大小没有变化

那可能是什么?或者我在压缩BLOB_TEXT时做错了什么?
我预计数据库大小也会减少,因为这是我唯一的重列。

【问题讨论】:

    标签: php sqlite compression blob


    【解决方案1】:

    在压缩之前,数据库已被数据填充到大约 100%。 压缩后,它包含大约 5 % 的数据和大约 95 % 的可用空间。

    通常,避免减小文件大小是个好主意,因为空闲空间稍后会被新数据填满。 如果要重新打包数据库,请运行VACUUM

    【讨论】:

    • +1 VACUUM 重建数据库,回收空白空间并减小数据库文件的大小。
    • 如果您用$query = $db-&gt;prepare("VACUUM"); $query-&gt;execute(); 丰富它,我会接受答案,肯定会强调与我的问题和描述中的源代码相匹配的解决方案。
    猜你喜欢
    • 2016-10-28
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多