[TrollModeOn] 我有一个问题....试图用 no-sql 解决方案解决它,现在我有 2 个问题 [/TrollModeOff]。
在我看来,no-sql 解决方案不适合处理这么多过滤器的东西。我将从基于 sql 的解决方案开始。例如,如果我们有 ms sql server,我们可以将用户定义的表类型用于过滤器,例如:
CREATE TYPE [FilterTable] AS TABLE(
[id] [int] NOT NULL --or any datatype needed
)
之后,您可以将表类型作为参数传递给过滤存储过程(或使用 sql 查询),例如:
CREATE PROCEDURE [SomeFilterProcedureName]
@Filter1 FilterTable READONLY,
@Filter2 FilterTable READONLY
....
你的查询会是这样的:
SELECT
field1,
field2,
field3
FROM MyTable t
WHERE
(@Filter1 IS NULL OR t.field1 IN (SELECT id FROM @Filter1))
AND (@Filter2 IS NULL OR t.field2 IN (SELECT id FROM @Filter2))
....
ORDER BY
whatever
所以基本上你检查你的参数是否包含一些值,如果是的话 - 你根据过滤器参数数据过滤掉列值。
RDBMS 在存储、查找、过滤和排序大量数据方面做得非常出色,但是您需要以正确的方式对其进行调整以使其更快地工作,例如您需要正确设置索引。您也可以缓存数据一段时间,但请确保根据不同的参数构建正确的缓存键。
如果您的数据库服务器不足以每秒处理 200 个查询,您可能需要创建一个集群或保持多个数据库服务器具有相同的数据并使用某种数据库平衡器。
更新:它太大了,不能放在评论中
It the worst case he can select "All" for every 11 filter and we have to sort 192 million records to find 20-100 with the lowest cost
全过滤器,成本最低?是不是和以下一样:
Select top(20) * from someTableName order by cost
。
Db Locks
. 更好地处理索引和查询
Sorting
. 好的,您有 1 亿条适合过滤器的记录。你打算如何对它们进行排序?QSort、MergeSort、BubbleSort?或者也许是stackoverflowSort?你知道你必须选择哪种算法吗?但首先——DBMS 知道,它为案例选择了最佳算法,因为它有统计信息,其次——当然数据是预先排序存储在索引中的。所以每 100m 记录排序操作都会杀死 no-sql 解决方案,但会在 rdbms 上完美运行
High load
. 不是我们说的吗?在您的情况下,那里并不是真正的高负载。有些公司每月有 100-1.5 亿活跃用户,拥有巨大的数据库,每秒有数千次查询,是的,他们使用 rdbms。数十台服务器,分片,平衡,完美运行。