数据库
首页 > 数据库> > 如何在MySQL中有效地存储静态哈希列表?

如何在MySQL中有效地存储静态哈希列表?

作者:互联网

问题:我有一对配对列表(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