如何优化大规模MySQL表上计算列的ORDER BY

如何优化大规模MySQL表上计算列的ORDER BY,mysql,query-optimization,sql-order-by,Mysql,Query Optimization,Sql Order By,我有一个非常大(8000多万行)的非规范化MySQL表。简化的模式如下所示: +-----------+-------------+--------------+--------------+ | ID | PARAM1 | PARAM2 | PARAM3 | +-----------+-------------+--------------+--------------+ | 1 | .04 | .87

我有一个非常大(8000多万行)的非规范化MySQL表。简化的模式如下所示:

+-----------+-------------+--------------+--------------+ | ID | PARAM1 | PARAM2 | PARAM3 | +-----------+-------------+--------------+--------------+ | 1 | .04 | .87 | .78 | +-----------+-------------+--------------+--------------+ | 2 | .12 | .02 | .76 | +-----------+-------------+--------------+--------------+ | 3 | .24 | .92 | .23 | +-----------+-------------+--------------+--------------+ | 4 | .65 | .12 | .01 | +-----------+-------------+--------------+--------------+ | 5 | .98 | .45 | .65 | +-----------+-------------+--------------+--------------+ 通过一些适当的索引,这对于基本查询来说是很快的,但是我想不出一个好方法来在这么大的表上加速上面的查询

详情:

  • 每个参数值都在0和1之间
  • 应用于参数的每个权重介于0和1s之间
--编辑--

问题的简化版本如下

这将在合理的时间内运行:

SELECT value1, value2 
FROM sometable 
WHERE id = 1 
ORDER BY value2
 SELECT value1, (value2 * an_arbitrary_float) as value3 
 FROM sometable 
 WHERE id = 1 
 ORDER BY value3
这不会在合理的时间内运行:

SELECT value1, value2 
FROM sometable 
WHERE id = 1 
ORDER BY value2
 SELECT value1, (value2 * an_arbitrary_float) as value3 
 FROM sometable 
 WHERE id = 1 
 ORDER BY value3

使用上面的示例,有没有任何解决方案可以让我在不提前计算值3的情况下完成订单?

MySQL缺少许多可以帮助您实现这一点的性感功能。也许您可以添加一个列,其中包含计算出的排名,为其编制索引,并编写几个触发器来保持更新。

我发现了两个(有点明显)的东西,它们有助于将查询速度提高到令人满意的水平:

  • 最小化需要排序的行数。通过在“id”字段上使用索引和子选择来首先修剪记录数,计算列上的文件排序就没有那么糟糕了。即:

    SELECT t.value1, (t.value2 * an_arbitrary_float) as SCORE
    FROM (SELECT * FROM sometable WHERE id = 1) AS t 
    ORDER BY SCORE DESC
    
  • 尝试在my.conf中增加以加快这些文件存储


  • 我知道这个问题很老,但我最近遇到了这个问题,我提出的解决方案是使用派生表。在派生表中,创建计算列。在外部查询中,您可以按它排序。对于我的工作量来说,它似乎运行得更快(数量级)


    您可以使用“010001”按钮格式化代码<代码>
    标记无法识别。我已经为你做了。你现在有什么索引?解释者对此有何评论?我意识到你可能无法为你的精简版获得这些东西,但如果可能的话,这会很有帮助。我在这张表上有几个索引,它们确实被用于其他查询。ID有一个索引,然后有(ID,PARAM1)和(ID,PARAM2)的索引,让我可以运行查询,在那里我可以获取给定ID的前10行,按PARAM1排序。通过查看EXPLAIN,问题在于在动态计算的(未索引)列上使用“ORDER BY”时发生的文件排序。我不确定有没有解决这个问题的办法。+1个好的、写得好的问题。欢迎来到索多,你认为这张桌子将来会变得更大吗?它是什么存储引擎?你能给出你的mysql服务器硬件的一些规格吗?问题是用来计算分数的权重,是基于用户输入的,直到运行时才知道。因此,没有办法(轻松地)提前计算分数。一种可能的解决方案是将参数的权重从浮点更改为一组已知的值(0、.2、.4、.6、.8),但这些计算值的存储需求将非常大。