MySQL查询速度慢,因为ORDER BY带有存储函数

MySQL查询速度慢,因为ORDER BY带有存储函数,mysql,performance,sql-order-by,stored-functions,Mysql,Performance,Sql Order By,Stored Functions,在以下查询中删除订单时,我的查询从15秒变为0.05秒: 简化版: 我有两个存储函数来计算子分数。不过我得根据总分来排序。按照我使用*2的顺序,向子分数添加一些权重,以影响总分 我使用MySQL 5.6.13 有没有人知道我如何在不放慢速度的情况下完成订单? 比如,是否可以保存和存储分数字段并对其进行汇总 谢谢 您可以向表中添加一个total_score列,并定义一个触发器,以便在添加或更新行时自动更新该列。然后对列进行索引,按总分排序应该很快。时间上的差异是因为MySql需要创建一个排序的临时

在以下查询中删除订单时,我的查询从15秒变为0.05秒:

简化版:

我有两个存储函数来计算子分数。不过我得根据总分来排序。按照我使用*2的顺序,向子分数添加一些权重,以影响总分

我使用MySQL 5.6.13

有没有人知道我如何在不放慢速度的情况下完成订单? 比如,是否可以保存和存储分数字段并对其进行汇总


谢谢

您可以向表中添加一个total_score列,并定义一个触发器,以便在添加或更新行时自动更新该列。然后对列进行索引,按总分排序应该很快。

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

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

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

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


正如lowleveldesing所说,这种类型的查询迫使mysql在给出任何输出之前计算所有寄存器的产品分数1*1+score2*2+score3*2+score4*4。

这是两个表之间的实时算法。我将一个表的值注入函数。在这种情况下,最好考虑将此函数转换为与另一个表的联接。@RaulLuna这对ORDER BY有什么帮助?好的,我找到了一些东西。分数是对存储函数的引用。ORDER BY是一种排序方法,它对这些参考文献进行了大量比较。因此,存储的函数将执行很多次。有没有办法将存储函数的返回值设置为静态字段?我正在对大约2000行进行排序,以及返回前20个结果的内容。因此,您要创建一个临时表,如:创建临时表temp_table AS SELECT field1。。从表中排序?临时表不是解决方案!:请详细说明你的评论好吗?怎么搞的?查询是否运行得更快?您是否尝试过仅使用设置为“仅自动递增”的主键填充临时表?通过这种方式,您可以测量收集数据阶段所需的时间。还有一点需要注意的是,我是说,您需要创建一个临时表,将主键设置为order by子句的值,并使用一个autoincrement,autoincrement仅使该值唯一。这样,当您对这个临时表运行select时,其中的数据已经被排序。这将是理想的,但不适用于这种情况。我需要实时做算法。
Insert into t(order_by_result, n, ...)
select (score1 * 1 + score2 * 2 + score3 * 2 + score4 * 4),null,...