mysql - 从 MySQL 中调用函数
问题描述
在视图的 where 子句中调用函数时,MySQL 是具体化视图然后应用该函数还是调用该函数然后将其添加到视图中?
在应用程序中,我正在处理对 API 的每次调用都会设置一个 MySQL 变量 CustomerId。然后它调用视图上的查询。在这个视图中,where 子句中有一个函数调用,它根据 where 变量过滤视图。
示例函数
create function PARAM_CUSTOMERID() returns int
BEGIN
RETURN @Param_CustomerId;
END;
示例视图
create view TransactionPaymentSummary
select t.Id,
sum(f.TotalFee) as TotalFees,
sum(p.TotalPayment) as TotalPayment,
t.CustomerId
from Transactions t
left join Fees_Summary f on t.Id = f.TransactionId
left join Payments_Summary p on t.Id = p.TransactionId
where t.CustomerId = PARAM_CUSTOMERID();
当我在有问题的视图上运行解释计划时,它似乎在执行类似的操作时仍然运行全表扫描
explain extended select *
from TransactionPaymentSummary
但是当我使用 where 子句对类似查询执行解释计划时,它似乎执行了 ref 类型查询
explain extended select *
from TransactionPaymentSummary
where CustomerId = 50;
解决方案
推荐阅读
- ruby-on-rails - 尝试显示带有 422 错误的 JSON Rails React
- gnuplot - 用两个不同文件的开始和结束绘制箭头
- sql-server - SQL Server 2008 - 添加了一列,现在缺少一堆磁盘存储
- reporting-services - SSRS 中的 IIF 条件和处理零
- vue.js - 无法读取未定义 APOLLO GRAPHQL 的“then”属性
- winforms - 在datagridview(winform)中连接2列的值
- javascript - 为什么 iife chage 中“X”的值取决于我们访问它的方式?
- r - Sparklyr/Dplyr - 如何为 sparkdata 帧的每一行应用用户定义的函数并创建将每一行的输出写入新列?
- c - 如何将 scanf 的输入限制为整数和浮点数(一般为数字)
- android - 非静态类不能有静态变量