0

当我在以下查询中删除 ORDER BY 时,我的查询从 15 秒变为 0.05 秒:

简化版:

SELECT field1, fiedl2, field 3,  
    FUNC1(1, 2) AS score1,  
    FUNC2(1, 2) AS score2,  
    FUNC3(1, 2) AS score3,  
    FUNC4(1, 2) AS score4  
FROM table  
WHERE field1 = 1  
ORDER BY (score1 * 1 + score2 * 2 + score3 * 2 + score4 * 4) DESC;

我有几个计算子分数的存储函数。除了我必须根据总分排序结果。在 ORDER BY 中,我使用* 2给子分数添加一些权重来影响总分。

我使用 MySQL 5.6.13

有没有人知道我可以如何制作 ORDER BY,但又不能放慢速度?是否可以存储score#字段并总结它们?

谢谢!

4

3 回答 3

1

时间上的差异是因为 MySql 需要创建一个排序的临时表并用数据填充它。由于您的查询在使用 order by 时运行速度要慢得多,因此问题可能出在存储临时数据的磁盘中。您还没有提到从该查询返回的行数。您也可以尝试手动执行 MySql 可能正在执行的步骤,因此使用主键 (order_by_result int, n int auto_increment) 创建一个临时表并将您的选择结果插入其中:

Insert into t(order_by_result, n, ...)
select (score1 * 1 + score2 * 2 + score3 * 2 + score4 * 4),null,...

并检查 hpw 是否快速运行 - 如果问题出在您的存储中,您也可以通过这种方式检查。

于 2013-10-29T09:46:17.480 回答
0

您可以向表中添加一total_score列,并定义一个触发器以在添加或更新行时自动更新它。然后索引列,并且ORDER BY total_score应该很快。

于 2013-10-28T15:38:17.920 回答
0

我认为最好的解决方案是预先计算函数的值并将它们存储在数据库中。这样,动态计算函数值的问题将转化为一个非常简单的排序查询。

正如lowleveldesing所说,这种类型的查询会强制mysql(score1 * 1 + score2 * 2 + score3 * 2 + score4 * 4)在给你任何输出之前计算所有寄存器的乘积。

于 2013-10-29T11:51:48.090 回答