我正在一个数据库中存储一个对象,由大量的整数属性描述。真正的对象有点复杂,但现在让我们假设我将汽车存储在我的数据库中。每辆车都有很多整数属性来描述汽车(即最大速度,轴距,最大功率等),这些都可以由用户搜索。用户为每个对象定义了一个首选范围,并且由于有很多属性,所以很可能不会有任何车辆匹配所有的属性范围。因此,查询必须返回按最佳匹配排序的多辆汽车。选择哪个数据库来寻找最佳匹配记录?
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的属性是用户定义的值:
目前我使用下面的查询实现这在MySQL。基本上匹配是所需范围和属性的实际值之间的平方差的总和的平方根。值为0表示完美匹配。
该表包含几百万条记录,而WHERE clausule仅用于限制执行计算的记录数。索引放置在所有可查询记录上,查询需要500毫秒。我想改善这个数字,我正在研究如何改进这个查询。
此外,我想知道是否会有一个不同的数据库更适合执行这项工作。此外,我非常想更改为NoSQL数据库,因为它具有更灵活的数据方案选项。我一直在研究MongoDB,但无法找到有效(快速)解决此问题的方法。
有什么数据库比MySQL更适合这项工作吗?
我失踪,你真正遇到了问题 - 这听起来像过早优化... –
您可以查看SQL服务器或Oracle能够为视图编制索引。创建一个描述行及其匹配并为其编制索引的视图。 –
@OMG:我认为他的意思是希望搜索类型:'SELECT macthCalculation FROM t WHERE(BETWEEN amin and amax)AND(b BETWEEN bmin and max)...',其中有几百万条记录并搜索超过2或更多的属性可能会缓慢与BTREE索引。 –