gpt4 book ai didi

尽管有 LIMIT,但使用自定义函数的 MySQL 查询速度非常慢

转载 作者:行者123 更新时间:2023-11-29 01:55:51 26 4
gpt4 key购买 nike

我有下表

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;

然而,这个查询执行的时间很长(当表有 > 5000 行时 > 2s)。

我想出了一个 hack:

SELECT *, MY_FUNC(2, attrib1, attrib2) FROM (
SELECT * FROM myTable ORDER BY creationTime LIMIT 0, 15
) AS temp;

哪个有效,而且工作速度很快(同一张表 < 0.1 秒)。但我不喜欢这种解决方案。

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

我知道如果它们用在 WHEREORDER 子句中,它们不会毫无用处。但他们不是。

最佳答案

为什么MySQL要计算所有行的函数?这就是数据库的工作方式(不仅仅是 MySQL)。 ORDER BY子句应用于 SELECT 之后的结果集 , FROM , WHERE , GROUP BY , 和 HAVING条款进行处理。为了创建结果集,必须处理所有行的值。 LIMIT应用于 ORDER BY 的结果.

您已经找到了获得所需性能的方法:

SELECT t.*, MY_FUNC(2, attrib1, attrib2)
FROM (SELECT t.*
FROM myTable t
ORDER BY creationTime
LIMIT 0, 15
) t;

这不是“hack”,而是一种非常合理的解决问题的方法。一个参数改变了 MySQL 和所有其他数据库引擎执行此处理的方式。那将是一个黑客。

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

关于尽管有 LIMIT,但使用自定义函数的 MySQL 查询速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29626305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com