MySQL:LIMIT是否减少了对用户定义函数的调用次数?

MySQL:LIMIT是否减少了对用户定义函数的调用次数?,mysql,limit,user-defined-functions,database-performance,Mysql,Limit,User Defined Functions,Database Performance,我有一个计算成本很高的用户定义函数,需要对大型数据集使用它。我不排序也不要求行数(未找到行)。如果我将LIMIT指定为查询的一部分,那么MYSQL引擎在获取LIMIT行后是否会停止调用该函数,或者是否会对整个数据集运行该函数?例如: select cols, .. where fingerprint_match(col, arg) > score limit 5; 理想情况下,如果第一(随机)行导致及格分数,则将调用指纹匹配至少5次。如下所述: MySQL有时会优化具有LIMIT行计数

我有一个计算成本很高的用户定义函数,需要对大型数据集使用它。我不排序也不要求行数(未找到行)。如果我将LIMIT指定为查询的一部分,那么MYSQL引擎在获取LIMIT行后是否会停止调用该函数,或者是否会对整个数据集运行该函数?例如:

select cols, .. where fingerprint_match(col, arg) > score  limit 5;
理想情况下,如果第一(随机)行导致及格分数,则将调用指纹匹配至少5次。

如下所述:

MySQL有时会优化具有
LIMIT行计数
子句且没有
具有
子句的查询:

[ deletia ] [deletia]
  • 一旦MySQL向客户端发送了所需的行数,它就会中止查询,除非您使用的是
    SQL\u CALC\u FOUND\u rows

我相信只要找到指定数量的匹配项,查询就会停止处理,但只有在没有ORDER BY子句的情况下才会停止处理。否则,它必须在应用限制之前查找并排序所有匹配项

关于这一点,我唯一的证据是文档中的一句话,
“LIMIT 0快速返回一个空集。这对于检查查询的有效性非常有用。”
。这对我来说意味着,一旦满足了限制,就不必对任何行应用where子句


请注意,虽然前5行是不确定的,但它们不是随机的。不一定。例如,如果可以使用索引解析排序,MySQL可能能够轻松识别要返回的行,而无需检查所有匹配项。关于索引的公平点。但是这个问题与用户定义的函数有关,所以我假设索引不可用。还要注意,当前
EXPLAIN
没有显示
限制
优化。您需要计时以确认并使用
SQL\u NO\u CACHE
防止查询缓存影响测试。