【发布时间】:2014-02-24 02:03:55
【问题描述】:
我有一个包含几百万个 sha256 哈希文件的数据库。 我经常收到数百万个新文件,我必须对照数据库检查这些文件以避免重复。
根据 mysql 数据库检查文件的哈希值需要数年时间。我已经将散列分成 16 个表(0 到 F)。我已经尝试过 couchbase,但这需要超过 8GB 的 RAM,并且由于 RAM 使用量过多而留下了几百万个哈希值,因此中止了导入...
谁能给我一个解决方案,在比 MySQL 更快的数据库中存储大约 4.5GB 的哈希(将哈希转储到纯文本文件时计算的大小)?
哈希存储时没有任何元信息,没有文件名或路径或 id 或其他内容。
亲切的问候, 3vilc00kie
编辑表定义:
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Host: 127.0.0.1
-- Erstellungszeit: 31. Januar 2014 um 13:55
-- Server Version: 5.5.8
-- PHP-Version: 5.3.5
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Datenbank: `filehashes`
--
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `0`
--
CREATE TABLE IF NOT EXISTS `0` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `1`
--
CREATE TABLE IF NOT EXISTS `1` (
`sha256` binary(32) NOT NULL,
UNIQUE KEY `sha256` (`sha256`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `2`
--
CREATE TABLE IF NOT EXISTS `2` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `3`
--
CREATE TABLE IF NOT EXISTS `3` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `4`
--
CREATE TABLE IF NOT EXISTS `4` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `5`
--
CREATE TABLE IF NOT EXISTS `5` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `6`
--
CREATE TABLE IF NOT EXISTS `6` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `7`
--
CREATE TABLE IF NOT EXISTS `7` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `8`
--
CREATE TABLE IF NOT EXISTS `8` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `9`
--
CREATE TABLE IF NOT EXISTS `9` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `a`
--
CREATE TABLE IF NOT EXISTS `a` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `b`
--
CREATE TABLE IF NOT EXISTS `b` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `c`
--
CREATE TABLE IF NOT EXISTS `c` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `d`
--
CREATE TABLE IF NOT EXISTS `d` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `e`
--
CREATE TABLE IF NOT EXISTS `e` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `f`
--
CREATE TABLE IF NOT EXISTS `f` (
`sha256` binary(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
【问题讨论】:
-
拆分表可能会适得其反。如果您的表在散列值上正确索引,则检查散列不应花费“年”。发布您的表定义。
-
这没有意义。如果您已经在数据库中索引了哈希列,那么检查一个只有几千万的表应该几乎是即时的。告诉我们更多,您执行什么样的查询,以及表的外观如何(包括索引)。 (在这种情况下需要时间实际上是计算文件内容的哈希)
-
妈的,我只用了一次 UNIQUE ……对所有表都实现了会不会快很多?
标签: mysql database hash memcached bigdata