我预先计算了一些相似之处(大约7000万)并希望找到从一个音轨到所有其他音轨的相似之处。我只需要具有最高相似度的前100名赛道。对于我的计算,我执行此查询大约15&000,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秒(previous question),但我担心状态页面中的数字非常庞大。我以为我已经设置了我在查询中使用的每个索引。
Handler_read_rndDokumentation 88,0 M
Handler_read_rnd_nextDokumentation 20,0 G
有什么"错误"?我可以更快地得到查询吗?我不得不担心20G吗?
提前致谢
答案 0 :(得分:0)
这里显然错误的第一件事是你似乎在计算元组之间的方向关系 - 如果f(a,b)=== f(b,a)那么你可以通过交换来简化你的系统track1和track2周围track1大于track2但保留现有主键(并忽略冲突)。
您只是将数据量减半 - 因此不会带来巨大的性能提升。
可能还有进一步提高性能的余地,但这在很大程度上取决于数据变化的频率,更具体地说,你应该修剪相似性不在前100名的记录。