尽管有限制,MySQL的查询速度非常慢,带有自定义函数

尽管有限制,MySQL的查询速度非常慢,带有自定义函数,mysql,sql,Mysql,Sql,我有一张桌子 id INT UNSIGED PRIMARY KEY attrib1 INT attrib2 INT creationTime TIMESTAMP 我有一个函数,它用属性计算出非常复杂的结果。它可以由外部的值参数化,因此我不能将结果存储为另一个属性。此外,函数是不确定的 MY_FUNC(param1, attrib1, attrib2) 现在,我想得到最后15行(按时间戳排序),并希望得到MY_FUNC的结果。我试过: SELECT *, MY_FUNC(2, attrib1,

我有一张桌子

id INT UNSIGED PRIMARY KEY
attrib1 INT
attrib2 INT
creationTime TIMESTAMP
我有一个函数,它用属性计算出非常复杂的结果。它可以由外部的值参数化,因此我不能将结果存储为另一个属性。此外,函数是不确定的

MY_FUNC(param1, attrib1, attrib2)
现在,我想得到最后15行(按时间戳排序),并希望得到
MY_FUNC
的结果。我试过:

SELECT *, MY_FUNC(2, attrib1, attrib2) FROM myTable ORDER BY creationTime LIMIT 0, 15;
Hovewer,这个查询执行的时间非常长(当表的行数>5000行时>2s)

我想出了一个窍门:

SELECT *, MY_FUNC(2, attrib1, attrib2) FROM (
   SELECT * FROM myTable ORDER BY creationTime LIMIT 0, 15
) AS temp;
它可以工作,并且工作速度很快(对于同一张表小于0.1s)。但我不喜欢这个解决方案

我假设在第一次查询中,MySQL对每个记录运行
MY_FUNC
,而不仅仅是对我要查询的15条记录。我说得对吗?有没有办法配置MySQL/query,以便只为选定的行计算函数?为什么MySQL会计算所有这些结果,尽管这些结果是无用的


我理解,如果在
WHERE
ORDER
子句中使用它们,它们也不会无用。但事实并非如此。

为什么MySQL计算所有行的函数?这就是数据库的工作方式(不仅仅是MySQL)。在处理
选择
其中
分组依据
具有
子句之后,将
排序依据
子句应用于结果集。为了创建结果集,必须处理所有行的值。
限制
应用于按排序的
结果

您已经找到了获得您想要的性能的方法:

SELECT t.*, MY_FUNC(2, attrib1, attrib2)
FROM (SELECT t.*
      FROM myTable t
      ORDER BY creationTime
      LIMIT 0, 15
     ) t;
这不是“黑客”,而是解决问题的非常合理的方法。一个参数改变了MySQL和所有其他数据库引擎执行此处理的方式。那将是一次黑客攻击


请注意:如果您没有索引,则
myTable(creationTime)
上的索引将有助于此查询的性能。

您应该有一个creationTime索引,但是,由于第二个查询执行得很快,我想这不是您的问题。执行
EXPLAIN SELECT*,MY_FUNC(2,attrib1,attrib2)从myTable按creationTime限制排序0,15