gpt4 book ai didi

mysql - 选择哪个数据库来查找最佳匹配记录?

转载 作者:可可西里 更新时间:2023-11-01 07:03:51 26 4
gpt4 key购买 nike

我将一个对象存储在一个由许多整数属性描述的数据库中。真实的对象有点复杂,但现在让我们假设我将汽车存储在我的数据库中。每辆汽车都有很多整数属性来描述汽车(即最大速度、轴距、最大功率等),用户可以搜索这些属性。用户为每个对象定义一个首选范围,并且由于有很多属性,所以很可能不会有任何汽车匹配所有属性范围。因此,查询必须返回按最佳匹配排序的汽车数量。

目前我使用以下查询在 MySQL 中实现了这一点:

SELECT *, SQRT( POW((a < min_a)*(min_a - a) + (a > max_a)*(a - max_a), 2) +
POW((b < min_b)*(min_b - b) + (b > max_b)*(b - max_b), 2) +
... ) AS match
WHERE a < (min_a - max_allowable_deviation) AND a > (max_a + max_allowable_deviation) AND ...
ORDER BY match ASC

其中 a 和 b 是对象的属性,min_a、max_a、min_b 和 max_b 是用户定义的值。基本上,匹配是所需范围与属性实际值之间的平方差之和的平方根。值为 0 表示完美匹配。

该表包含几百万条记录,引入 WHERE 子句只是为了限制执行计算的记录数。索引放在所有可查询的记录上,查询大约需要 500 毫秒。我想改进这个数字,我正在研究改进这个查询的方法。

此外,我想知道是否会有更适合执行此工作的不同数据库。此外,我非常想改用 NoSQL 数据库,因为它有更灵活的数据方案选项。我一直在研究 MongoDB,但找不到有效(快速)解决此问题的方法。

有没有比 MySQL 更适合这项工作的数据库?

最佳答案

看看R-trees . (有关特定变体的页面会详细介绍并提供伪代码)。这些数据结构允许您通过边界矩形进行查询,这就是您在每个属性上按范围搜索的问题所在。

将您的汽车视为 n 维空间中的点,其中 n 是描述您的汽车的属性数。然后给定 n 个范围,每个范围描述一个属性,问题是找到包含在该 n 维超矩形中的所有点。 R 树有效地支持此查询。 MySQL 为其空间数据类型实现了 R 树,但 MySQL 仅支持二维空间,这对您来说不够。我不知道有任何现成的支持 n 维 R 树的常见数据库,但是您可以使用一些对用户定义的树数据结构有良好支持的数据库并自己实现 R 树最重要的是。例如,您可以使用子指针为 MongoDB 中的 R 树节点定义一个结构。然后,您将在自己的代码中实现 R 树算法,同时让 MongoDB 负责存储数据。

此外,还有这个 C++ header file R树的实现,但目前它只是一个内存结构。尽管如果您的数据集只有几百万行,那么在启动时加载此内存结构并在添加新车时更新它似乎是可行的(我认为这种情况很少见)。

关于mysql - 选择哪个数据库来查找最佳匹配记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6804085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com