优化 MySQL 查询,避免对用户自定义函数的不必要调用

Posted

技术标签:

【中文标题】优化 MySQL 查询,避免对用户自定义函数的不必要调用【英文标题】:Optimize MySQL query to avoid unnecessary calls to user-defined function 【发布时间】:2010-03-17 16:52:27 【问题描述】:

我有一个查询,它在 SELECT 语句中多次调用用户定义的函数。函数 (vfget) 从字符串中包含的 key=value 对返回值。

查询是否可以只调用一次函数并将其存储在一个变量中,以便在同一个查询中重复使用?

目前我的查询是:

SELECT 
        CASE WHEN(right(vfget(appmod_params, 'service'), 3) = '_dd' OR right(vfget(appmod_params, 'service'), 3) = '_wp')
            THEN left(vfget(appmod_params, 'service'), length(vfget(appmod_params, 'service'))-3)
            ELSE vfget(appmod_params, 'service')
        END
FROM ota1003
LIMIT 10

【问题讨论】:

【参考方案1】:
SELECT  @vf := vfget(appmod_params, 'service'),
        case when right(@vf, 3) IN ('_dd', '_wp')
            then left(@vf, length(@vf) - 3)
            else @vf
        end
from ota1003
limit 10

或者这个:

SELECT  case when right(vf, 3) IN ('_dd', '_wp')
            then left(vf, length(vf) - 3)
            else vf
        end
FROM    (
        SELECT  vfget(appmod_params, 'service') AS vf
        FROM    ota1003
        LIMIT 10
        ) q

mysql 中的嵌套查询被缓冲,因此效率较低,尽管只有 10 条记录,这应该不是什么大问题。

【讨论】:

是否可以避免在结果中输出第一个字段? @James:将查询包含在嵌套查询中,尽管效率会降低。 谢谢,我会试试你的建议。

以上是关于优化 MySQL 查询,避免对用户自定义函数的不必要调用的主要内容,如果未能解决你的问题,请参考以下文章

mysql-SQL优化

MySQL EXPLAIN 命令: 查看查询执行计划

MYSQL优化

提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

23.Mysql应用优化

jQuery-性能优化-避免不必要的 DOM 操作