0

我已经预先计算了一些相似性(大约 7000 万个),并希望找到一首曲目与所有其他曲目的相似之处。我只需要相似度最高的前 100 首曲目。对于我的计算,我使用不同的轨道作为输入进行了大约 15'000 次此查询。机器启动后,所有 15k 查询的计算需要超过 600 秒。经过几次运行,mysql 已经 - 我认为 - 缓存了索引,因此完整的运行需要大约 15 秒。我唯一担心的是:我有一个非常高的“Handler_read_rnd_nextDokumentation”值。

我有一个具有这种结构的 MySQL 表:

CREATE TABLE `similarity` (
  `similarityID` int(11) NOT NULL AUTO_INCREMENT,
  `trackID1` int(11) NOT NULL,
  `trackID2` int(11) NOT NULL,
  `tracksim` double DEFAULT NULL,
  `timesim` double DEFAULT NULL,
  `tagsim` double DEFAULT NULL,
  `simsum` double DEFAULT NULL,
  PRIMARY KEY (`similarityID`),
  UNIQUE KEY `trackID1` (`trackID1`,`trackID2`),
  KEY `trackID1sum` (`trackID1`,`simsum`),
  KEY `trackID2sum` (`trackID2`,`simsum`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

我想对此做很多查询。查询如下所示:

// simsum is a sum over tracksim, timesim, tagsim
(
     SELECT similarityID, trackID2, tracksim, timesim, tagsim, simsum
     FROM similarity
     WHERE trackID1 = 512
     ORDER BY simsum DESC
     LIMIT 0,100
 )
 UNION
(
     SELECT similarityID, trackID1, tracksim, timesim, tagsim, simsum
     FROM similarity
     WHERE trackID2 = 512
     ORDER BY simsum DESC
     LIMIT 0,100
 )
 ORDER BY simsum DESC
 LIMIT 0,100

查询速度非常快,不到 0.1 秒(上一个问题),但我担心状态页面中的数字非常大。我以为我已经设置了我在查询中使用的每个索引。

Handler_read_rndDokumentation   88,0 M
Handler_read_rnd_nextDokumentation  20,0 G

有什么问题吗”?我可以更快地得到查询吗?我需要担心20G吗?

提前致谢

4

1 回答 1

0

这里明显错误的第一件事是您似乎正在计算元组之间的方向关系 - 如果 f(a,b)===f(b,a) 那么您可以通过交换 track1 和track2 其中 track1 大于 track2 但保留现有主键(并忽略冲突)。

您只是将数据量减半 - 因此不会有巨大的性能提升。

可能还有进一步提高性能的空间,但这在很大程度上取决于数据更改的频率,更具体地说,您应该修剪相似性不在前 100 名的记录。

于 2012-04-11T10:13:43.267 回答