【问题标题】:Optimizing database types to compact database (SQLite)将数据库类型优化为紧凑型数据库 (SQLite)
【发布时间】:2012-10-11 04:51:04
【问题描述】:

我正在压缩数据库 (SQLite),并且我正在尝试优化我在架构中分配的数据类型的大小。我掌握的数据大致可以分为3类数字。它们是:

  1. 101010000 - 9 位数字
  2. 01,- 只是一或零
  3. 13.4567 - 浮点型。我只想在这里存储 13.45。

所有数字都将用于程序中的数学运算。我使用这个网站作为参考:http://www.sqlite.org/datatype3.html

我想知道哪种数据类型亲和性会给我最紧凑的数据库。我目前的数据库大小接近 40 GB!

感谢您的帮助。

【问题讨论】:

    标签: sql database types sqlite


    【解决方案1】:

    在 SQLite 中,整数数据类型可以占用 1、2、4 或 8 个字节,具体取决于数据值有多大。 布尔类型存储为整数 0 或 1,并且总是占用 1 个字节。 REAL(浮点)数据需要 8 个字节来存储。如果您愿意将数据四舍五入为 2 位小数,您可能需要将浮点数据乘以 100 并将其存储为 4 字节整数值(并为每个值保存 4 个字节)。 你提到的9个二进制数字应该需要2个字节来存储。

    如何优化数据?有很多策略。 如果您有很多布尔字段,您可能可以使用一个字节来存储最多 8 位。这应该可以让您将存储效率提高 8 倍。 另一个好的策略是规范化您的数据:将其拆分为多个表。但是,这仅在您的数据架构允许此类拆分时才有效。

    通常,如果索引过多,它们可能会显着增加磁盘上数据库的大小。正确的解决方案是使用 EXPLAIN 修改软件使用的实际 SQL 查询,找出并不真正需要的索引并删除它们。

    最后,不要忘记使用 VACUUM FULL 可以使数据库占用尽可能小的磁盘空间,但运行它可能需要一段时间并且需要独占数据库锁。 祝你好运!

    【讨论】:

    • 感谢您的帮助。不过我有一个疑问 - SQLite 会自动使用 1、2、4 和 8 个字节,还是我们必须为 1 个字节指定 TINYINT,为 2 个字节指定 SMALLINT,依此类推...
    • 如果您阅读 sqlite 源代码,任何名称中包含 INT 的类型都被视为与 INTEGER 相同。如果您不相信 SQLite 将使用 1 个字节来存储布尔值(0 或 1),您可以简单地创建具有 100 万个布尔行的测试表并检查您的数据库在磁盘上的大小(不要忘记在插入)
    • INSERT 命令后第一次插入数据需要VACCUM 吗?数据会不会被紧凑地录入数据库?另外,我使用制表符分隔的文本文件来输入数据。数据库的大小会接近我使用的.dat 文件的大小吗?哪些附加信息使数据库更大。只是好奇。谢谢
    • 应该没有必要。但是,如果您想准确评估数据使用情况,您会想要这样做。此外,如果您有索引,与它们在一次大 INSERT 之后的状态相比,它们在 VACUUM 之后占用的空间可能会稍微少一些。数据库大小应该接近原始数据的大小,可能略多一些。但是,某些字段可能会显着压缩(例如在一个字节中节省 8 位)
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    相关资源
    最近更新 更多