我在mysql中有相当复杂的视图,比如
select filter.id as filter_id, person.id, person.name
from person, filter
inner join
...
left join
...
where person_match_filter_condition ...
group by filter.filter_id, person.id, person.name
查询过滤对应于特定于域的条件的人。
视图的典型用途是:
select * from where filter_id = some_value
问题是mysql无法优化查询。它通过filter_id应用confition来获取所有过滤器的数据 - 非常无效。
从其他表中获取filter_id的想法对我的情况不利。
如何转换查询以使其更有效?
答案 0 :(得分:0)
在过程中包装长查询,并将过滤器作为参数传递给过程调用。然后,不是使用您调用过程的视图,该过程将构建整个查询并运行优化查询。
答案 1 :(得分:0)
更好的是,您可以通过创建一个函数来从会话变量获取值来以简单的方式将参数传递给您的视图。有关该技术,请参阅https://www.stackoverflow.com/questions/14511760。这是我可能希望在之后模式化的创建功能的副本。 DELIMITER //
创建功能fn_getcase_id()
返回MEDIUMINT(11)
决定没有SQL
BEGIN
RETURN @sv_case_id;
END //
DELIMITER; 您需要创建一个类似的FN(每个变量一个)。