由于带有存储函数的ORDER BY,MySQL查询速度很慢

时间:2013-10-28 15:35:06

标签: mysql performance sql-order-by stored-functions

当我在以下查询中删除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#字段并总结它们一样吗?

谢谢!

3 个答案:

答案 0 :(得分: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 fast它运行 - 如果问题出在您的存储中,您也可以这样检查。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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