【问题标题】:Mysql Order By Calculated Value - User Defined Weightings of CategoriesMysql 按计算值排序 - 用户定义的类别权重
【发布时间】:2009-10-02 23:00:36
【问题描述】:

我对项目的一些后期添加有一个小问题,mysql 和 PHP。

我们在 mysql 中有一个包含 200,000 行的表,每行都有一个指定的类别。最初,select 语句只会根据 where 子句和索引 id 的顺序提取所需的项目。很快。

但是,我们有一些用户要求能够为每个类别赋予权重(即金融 = 60%、信贷 = 25%、保险 = 15%)并启用复选框以随时间降低结果,这意味着选择语句现在必须计算一个值(类别 * 权重),以及是否为 where 子句返回的每个结果启用了复选框(类别 * 权重 * 1/天)。然后它必须按这个计算值排序。正如您可以想象的那样,每个查询都很慢(约 10 秒)。

现在我不确定在这里进行的最佳方法是什么,因为我不确定如何使用一个表格来保存这些计算值以进行索引(因为用户可以选择任何变体)。

如果您尝试简化排序(按加权、日期排序)也会出现问题,因为这明显不同于(按日期加权排序)为 80% * cat * 1/8days = 0.1 和 20% * cat * 1 /1day = 0.2 较高,但在第一次排序中不会显得较高。

我可以完全访问数据库和代码。有人对如何在不影响性能的情况下实现这种实用性有任何建议吗?

大家干杯

【问题讨论】:

  • 不清楚为什么这需要 10 秒。用户查询是否选择了大量行?
  • 嗨,大多数 where 子句返回超过 20,000 行,其中需要排序,然后限制为前 500 行。必须为这大约 20,000 行计算值。减少 where 子句返回的行数很困难,在日期/其他值上设置边界有时会跳过应该返回的项目。

标签: php sql mysql algorithm


【解决方案1】:

从您的描述看来,每个查询的每一行的排序标准可能不同。您唯一的选择可能是在数据库中添加更多硬件,或者使用不同的数据库。

编辑:如果数据集不经常更新,您可能能够识别常用的参数集和预计算索引。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2016-01-08
    • 2012-08-09
    • 2022-01-06
    • 1970-01-01
    • 2013-05-05
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多