问题:我有一对配对列表(md5_hash,id).我想将数据存储在MySQL中,我想进行这样的查询
SELECT id FROM table WHERE md5_hash = <some_hash>
对的数量可以是数十亿或数亿,并且数量是静态的 – 即,我不添加新记录.保存磁盘空间对我来说很重要.在这种情况下,时间并不是那么重要(如果查找的时间少于1秒,那么它就是okey).
我的想法:
我开始创建一个表,其中md5_hash以这种方式表示:
CREATE TABLE `myTable` (
`md5` binary(16) NOT NULL, ' the values are not unique but we can suppose they are.
`id` int(10) unsigned NOT NULL
) ENGINE=MyISAM
所以md5哈希表示为二进制数而不是十六进制字符以节省空间.出于同样的原因,列被定义为“NOT NULL”.我选择了MyISAM引擎,因为我的测试显示MyISAM比InnoDB需要更少的磁盘空间.此外,MyisAM工具可以压缩MyISAM表.
现在困难的部分来了.当我在md5列上创建索引时,索引需要的磁盘空间比数据本身多!我用1700万条记录测试了它,我的表占用了大约300 MB的磁盘空间,索引占用了大约330 MB的磁盘空间.索引的大小是疯狂的.
一个想法是提供MySQL预分配的md5哈希值,这应该导致索引大小更小.但我不知道该怎么做.
另一个想法是将myTable分成几个较小的表,以减小索引的大小.我试过mysql分区.但是,该功能的目的是改善查询时间而不是磁盘空间使用.
您是否知道如何减少所需的磁盘空间使用量?
解决方法:
一些选择:
>使用InnoDB.如果不是these reasons,那么压缩!使用InnoDB,您可以:
ALTER TABLE my_table ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
将8替换为4或2或1(希望)可以获得更好的压缩效果.由于表是静态的,我认为这对你来说是一个很好的解决方案(强压缩,写入速度变慢,但你不关心).
不仅数据被压缩 – 索引也.我建议这是你最简单的选择.
>仅索引列的一部分.您同意该列不是唯一的,但可以假定为.好;你的索引是UNIQUE索引吗?如果没有,请尝试:
ALTER TABLE my_table ADD INDEX `md5_prefix_idx` (md5(8))
仅索引列的前8个字节.
>尝试TokuDB,它是InnoDB的替代存储引擎,并且具有惊人的压缩(我看到数据比使用TokuDB积极压缩的InnoDB小20倍).
标签:mysql,mysql-5-5 来源: https://codeday.me/bug/20190806/1602419.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。