尽管有限制,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代码>