是否可以在不进行全表扫描的情况下根据列的累积 SUM 停止获取行?如果是这样,怎么做?
例子
假设您有一张表,卖家可以在其中列出待售商品。为简单起见,假设表包含字段quantity
和price
.
ID | 数量 | 价格 |
---|---|---|
1 | 2 | 5 |
2 | 4 | 3 |
3 | 3 | 4 |
4 | 1 | 1 |
5 | 4 | 3 |
您想购买 6 件商品,并且需要足够的行来覆盖 6 件商品,按最低价格排序。在这种情况下,您需要第 4 行(共 1 行)、第 2 行(共 5 行)和第 5 行(共 9 行,足以覆盖 6 行)。
问题
我尝试了很多东西,包括 JOINS、窗口函数和用户变量,但都没有成功。它可以工作,但是在处理数百万行时速度很慢。每个解决方案似乎都在为与 WHERE 子句匹配的每一行创建一个累积总和,然后选择累积总和足够多的行。这种方法具有可怕的性能。
使用多行获取 X 行,将它们添加到代码中,并在需要时在循环中请求 X 更多以覆盖数量时,有时会快得多。这确实带来了与并发访问相关的其他问题,并以这种方式降低了性能。
有没有办法用 MariaDB 做类似的事情?如果没有,有什么想法可以加快速度吗?
关于相同功能但没有性能部分的问题: 通过行值的总和限制 SQL