【发布时间】:2011-09-12 17:50:55
【问题描述】:
我在 mysql 中有 url 表,其中只有两个字段 id 和 varchar(255) 用于 url。目前那里有超过 5000 万个 url,我的老板刚刚给出了我关于扩展我们当前项目的线索,这将导致更多的 url 被添加到该 url 表中,预计数字在中期大约 1.5 亿明年。
目前数据库大小约为 6GB,所以我可以肯定地说,如果事情保持不变,那么它将超过 20GB,这是不好的。因此,我正在考虑一些可以减少 url 存储磁盘空间的解决方案。
我也想明确一下,这个表不是一个繁忙的表,目前没有太多的查询,所以我只是想节省磁盘空间,更重要的是我想探索短文本的新想法压缩及其在mysql中的存储
但是将来该表也可以被大量访问,因此最好在时间到来之前优化该表。
我做了很多工作来将 url 更改为数字形式并使用 BIGINT 进行存储,但由于它有 64 位的限制,因此效果不佳。同样是 BIT 数据类型的问题,也有 64 位的限制。
我转换为数字形式的想法基本上是 8 字节 BIGINT 存储 19 个数字,因此如果每个数字指向所有可能字符的字符集中的一个字符,那么如果所有字符的范围为 1-,它可以在 8 个字节中存储 19 个字符10,但在现实世界的场景中,有 52 个英文字符和 10 个数字加上很少的符号,所以它大约有 100 个字符集。所以,在最坏的情况下,BIGINT 仍然可以指向 6 个字符,是的,它不是最终判决,它仍然需要一些锻炼才能确切知道每个数字指向它是 10+ 数字或 30+ 数字或 80+ 数字,但你有差不多知道我在想什么。
更重要的一点是,由于 url 是可变长度的,所以我也在尝试节省小 url 的磁盘空间,所以我不想给出固定长度的列类型。
我还研究了一些文本压缩算法,例如 smaz 和 Huffman 压缩算法,但不太相信,因为它们使用某种字典单词,但我正在寻找一种干净的方法。
而且我不想使用二进制数据类型,因为它也占用太多空间,例如 varchars 字节。
【问题讨论】:
-
长度 255 对于 url 可能不够
-
我记得使用 20 GB 任何东西 的想法完全是科幻小说。但今天?即使是磁盘空间不足十倍的低端消费类 PC,也可能无法购买。这真的是对程序员时间的一种经济高效的利用吗?
-
你似乎误解了 varchar 的作用。
-
刚刚编辑了这个问题,以明确将来可能需要查询该表。因此,最好保持有效的形式。现在,请不要建议我添加索引,但我现在只想弄清楚存储效率。
-
@ajreal 我了解 varchars .. 但也许我在某个地方错了,所以请您详细说明一下吗?
标签: mysql url text compression