【问题标题】:Optimize pass parameter to view优化pass参数查看
【发布时间】:2010-01-19 06:59:07
【问题描述】:

我在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 应用配置 - 非常无效。 从其他表中获取 filter_id 的想法不适合我的情况。

如何转换我的查询以使其更有效?

【问题讨论】:

  • @burnall 使用四个空格缩进而不是 <blockquote> 代码块标签。我为你更新了你的问题。
  • 你使用索引吗?我也帮忙
  • 是的,有几个索引。问题不在他们身上

标签: sql mysql query-optimization


【解决方案1】:

将长查询包装在一个过程中,并将过滤器作为参数传递给过程调用。然后,您调用该过程而不是使用视图,该过程将为您构建整个查询并运行优化查询。

【讨论】:

  • 感谢您的回答!我考虑过这一点。不幸的是:1)我无法提供所有可能的参数,我需要灵活地加入查询与许多其他条件。我不想使用动态 SQL。 2) Java 后端使用 Hibernate。存储过程与 ORM 的兼容性很差。还有什么想法吗?
  • 只需提供 1 个字符串作为参数,即您传递给视图的完整子句。我不知道 Hibernate,我无法帮助你解决这个问题。
【解决方案2】:

更好的是,您可以通过创建一个从会话变量中获取值的函数以简单的方式将参数传递给您的视图。有关该技术,请参阅https://www.stackoverflow.com/questions/14511760。这是我的创建功能的副本,您可能希望模仿。 分隔符 //

创建函数 fn_getcase_id()
返回介质(11) 确定性无 SQL 开始

请参阅 stackoverflow.com/questions/14511760 并阅读所有信息两次或更多。 2017 年 4 月 13 日

RETURN @sv_case_id;

结束//

分隔符; 您将需要创建一个类似的 FN(每个变量一个)。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多