url文本压缩(不缩短)并存储在mysql中

时间:2011-09-12 17:50:56

标签: mysql url text compression

我在mysql中有url表,其中只有两个字段id和varchar(255)用于url。目前有超过5000万网址,我的老板刚刚给出了关于我们当前项目扩展的线索,这将导致在该网址表中添加更多网址,并且预计在该网址中间的数字大约为1.5亿。明年。

目前数据库大小约为6GB,所以我可以肯定地说,如果事情保持相同,那么它将超过20GB,这是不好的。所以,我正在考虑一些可以减少url存储磁盘空间的解决方案。

我还想明确表示这个表不是一个繁忙的表,并且在momen上没有太多的查询所以我只是想节省磁盘空间,更重要的是我希望探索短文本的新想法压缩及其在mysql中的存储

但将来该表也可以大量访问,因此在时机成熟之前更好地优化表。

我工作了很多,将url更改为数字形式并使用BIGINT存储,但因为它有64位的限制所以它没有很好地工作。同样是BIT数据类型的问题,并且也限制了64位。

转换为数字形式背后的想法基本上是8字节BIGINT存储19位数,所以如果每个数字指向所有可能字符的字符集中的字符,那么如果所有字符的范围都是1-,它可以存储8个字节的19个字符10但是在现实世界的场景中,有52个英文字符和10个数字加上几个符号,所以它大约100个字符集。因此,在最坏的情况下,BIGINT仍然可以指向6个字符,是的,它不是最终的判决,它仍然需要一些锻炼,以确切地知道每个数字指向的是10+位数或30+位数或80+位数但​​是你有几乎了解我在想什么。

更重要的是,由于url的长度可变,所以我也试图节省小网址的磁盘空间,所以我不想给出固定长度的列类型。

我也研究了一些文本压缩算法,如smaz和Huffman压缩算法,但不太相信,因为他们使用某种字典词,但我正在寻找一种干净的方法。

我不想使用二进制数据类型,因为它也需要像varchars那样占用太多空间。

2 个答案:

答案 0 :(得分:4)

尝试的另一个想法可能是识别公共字符串并用位图表示它们。例如,有两个位表示协议(http,https,ftp或其他),另一个位表示域是否以“wwww”开头,两个位表示域是否以“.com”结尾,“。 org“,”。edu“或其他东西。您必须对数据进行一些分析,看看它们是否有意义,以及是否有其他常见字符串可以识别。

如果您有相同网站的大量网址,您还可以考虑将您的表拆分为两个不同的网址,一个持有域,另一个包含域相对路径(以及查询字符串和片段ID,如果当下)。您有一个链接表,其中包含URL的id,域的ID和路径的ID,并且您将原始URL表替换为加入三个表的视图。域表不必限于域,您可以包含尽可能多的URL(例如,“http://stackoverflow.com/questions”)。这不需要太多的代码来实现,并且具有仍然可读的优点。您的数字编码可能更有效,一旦弄明白,您就必须分析数据,看看哪一个更有意义。

答案 1 :(得分:2)

如果你正在寻找128位整数,那么你可以使用二进制(16)这里16是字节。并且您可以将其扩展到64字节(512位),因此它不会占用比位数据类型更多的空间。您可以将二进制数据类型称为BIT数据类型的扩展,但是它的字符串变体。

说过我会建议使用字典算法来压缩URL和短字符串,但是使用url缩短服务所使用的技术的混合,比如使用AZ az 0-9组合三个单词来替换大字典单词,你会有更多的组合可用字62 X 62 X 62。

虽然我不确定你会达到什么级别的压缩,但以这种方式实现url压缩并不是一个坏主意。