搜索 5 亿条二进制数据记录

Par*_*roX 5 mysql schema database-recommendation

我将把500,000,000张图片的签名插入到数据库中。签名将使用libpuzzle生成。每个签名是 338 个字节。(所以 160 GB)加上一个搜索表(阅读下文)。我更愿意将主数据库保留在带有标准 HDD 的 VPS 服务器上(由于成本问题,没有 SSD)。

最重要的方面是搜索时间,插入时间无所谓。

过去,我在 MySQL 中尝试了所有这些(记录更少),并且所有内容都使用一个数据库,主要搜索采用如下方案:

--
-- Table structure for table `signatures`
--

CREATE TABLE IF NOT EXISTS `signatures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `compressed_signature` varchar(338) NOT NULL,
  `picture_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `picture_id` (`picture_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1107725 ;

-- --------------------------------------------------------

--
-- Table structure for table `stored_pictures`
--

CREATE TABLE IF NOT EXISTS `stored_pictures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  `pid` bigint(20) unsigned NOT NULL,
  `num` int(11) NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `picture_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_url` (`url`),
  KEY `idx_picture_id` (`picture_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2773867 ;

-- --------------------------------------------------------

--
-- Table structure for table `words`
--

CREATE TABLE IF NOT EXISTS `words` (
  `pos_and_word` char(5) NOT NULL,
  `signature_id` int(11) NOT NULL,
  KEY `idx_pos_and_word` (`pos_and_word`),
  KEY `signature_id` (`signature_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
Run Code Online (Sandbox Code Playgroud)

根据 libpizzle 的性质,您会在words表格中搜索许多内容signature_id,然后compressed_signaturesignatures表格中获取所有内容,进行一些数学运算,然后为每个签名返回一个分数,以了解它与搜索的相似程度。然后对于高于阈值的每个相似性,我将stored_pictures通过查找picture_id

搜索 40,000,000 张图片,1 次搜索大约需要 5 分钟 - 所以我认为还有改进的空间。特别是因为我希望它能够快速达到 5 亿条记录。

我是否应该将所有非必要数据(只有大约 1% 的大小,即与特定图片相关的所有内容)单独放在一个单独的数据库中?在单独的服务器上?

因为它只是对pos_and_word所有signature_id可能匹配的's进行大量搜索和吐出,我认为与数据没有任何类型的关系可以帮助我选择一种可以最大限度地提高我的速度的特定技术。哪种技术最适合这种情况?

ouc*_*cil 1

您应该考虑使用真正的索引搜索引擎,例如在 Java 上运行的 elasticsearch,使用带有 json 的 REST 接口,因此非常容易编程,是免费和开源的,背后有一个良好的社区。

www.elasticsearch.org

只要您有一台足够好的机器,并且它是专门为近乎实时地搜索数亿个文档而构建的,您就可以让它与您的应用程序在同一台服务器上运行。

非常容易安装和设置,并且非常容易定制。它还具有构建为在云中运行(尽管不是必需的)的额外好处,并且当您的应用程序开始流行时可以非常容易地集群出来。