我在 mysql 中有一个 url 表,其中只有两个字段 id 和 varchar(255) 用于 url。目前那里有超过 5000 万个 url,我的老板刚刚向我提供了有关当前项目扩展的线索,这将导致在该 url 表中添加更多的 url,预计到 2020 年中期的数量将达到 1.5 亿左右。明年。
目前数据库大小约为 6GB,所以我可以有把握地说,如果保持同样的方式,那么它将超过 20GB,这不太好。因此,我正在考虑一些可以减少 url 存储磁盘空间的解决方案。
我还想澄清的是,这个表不是一个繁忙的表,目前没有太多查询,所以我只是想节省磁盘空间,更重要的是我想探索短文本压缩的新想法及其存储在mysql中
但将来该表也可能会被大量访问,因此最好在时间到来之前优化该表。
我花了相当多的时间将 url 更改为数字形式并使用 BIGINT 进行存储,但由于它有 64 位的限制,所以效果不太好。 BIT 数据类型也存在同样的问题,并且也施加了 64 位的限制。
我转换为数字形式的想法基本上是8字节BIGINT存储19个数字,因此如果每个数字指向所有可能字符的字符集中的一个字符,那么如果所有字符的范围从1到10,那么它可以在8个字节中存储19个字符,但作为在现实世界中,有 52 个英文字符和 10 个数字加上一些符号,因此大约有 100 个字符集。因此,在最坏的情况下,BIGINT 仍然可以指向 6 个字符,是的,这不是最终的结论,它仍然需要一些锻炼才能确切地知道每个数字指向的内容是 10+ 位或 30+ 位或 80+ 位,但你有几乎知道我在想什么。
更重要的一件事是,由于 url 的长度是可变的,所以我也试图节省小 url 的磁盘空间,所以我不想给出固定长度的列类型。
我还研究了一些文本压缩算法,例如 smaz 和 Huffman 压缩算法,但不太相信,因为它们使用某种字典单词,但我正在寻找一种干净的方法。
而且我不想使用二进制数据类型,因为它也像 varchars 一样占用太多字节空间。
另一个可以尝试的想法可能是识别常见字符串并用位图表示它们。例如,有两位表示协议(http、https、ftp 或其他),另一位表示域名是否以“wwww”开头,两位表示域名是否以“.com”、“. org”、“.edu”或其他名称。您必须对数据进行一些分析,看看这些是否有意义,以及是否有任何其他可以识别的常见字符串。
如果同一站点有很多 URL,您还可以考虑将表拆分为两个不同的表,一个包含域,另一个包含域相对路径(以及查询字符串和片段 ID,如果存在)。您将有一个包含 URL id、域 id 和路径 id 的链接表,并且您将用连接三个表的视图替换原始 URL 表。域表不必限于域,您可以包含尽可能多的常见 URL(例如“http://stackoverflow.com/questions”)。这不需要太多代码来实现,并且具有仍然可读的优点。你的数字编码可能会更有效,一旦你弄清楚了,你就必须分析你的数据,看看哪一种更有意义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)