我有一个计算上昂贵的用户定义函数,我需要对大型数据集使用。我不排序也不要求行数(没有FOUND_ROWS)。如果我将LIMIT指定为查询的一部分,那么MYSQL引擎在获取LIMIT行后是否实际上停止调用该函数,或者它是否针对整个数据集运行该函数?例如:
select cols, .. where fingerprint_match(col, arg) > score limit 5;
理想情况下,如果第一(随机)行导致通过分数,则仅会调用fingerprint_match 5次。
答案 0 :(得分:1)
MySQL有时会优化具有
LIMIT row_count
子句且没有HAVING
子句的查询:[ deletia ]
- 一旦MySQL向客户端发送了所需的行数,它就会中止查询,除非您使用的是
SQL_CALC_FOUND_ROWS
。
答案 1 :(得分:-1)
我相信一旦找到指定数量的匹配,查询就会停止处理但仅在没有ORDER BY子句时才会停止处理。否则,它必须在应用限制之前查找并排序所有匹配项。
我对此的唯一证据是"LIMIT 0 quickly returns an empty set. This can be useful for checking the validity of a query."
文档中的陈述。这告诉我,一旦满足限制,它就不会将where子句应用于任何行。
http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html