mysql视图与存储过程

时间:2014-07-31 07:47:10

标签: mysql stored-procedures join database-design

我正在为我正在开发的应用程序设计我的mysql数据库。

我喜欢Stored Procedures简短易读,而且因为我的数据库涉及一些join语句,我想也许我应该创建Views所有joins和从我的Views查询这些Stored Procedures

起初这听起来很棒,但是当我谈到性能时,我意识到无论何时调用Stored Procedure它都会运行至少2个查询:

  1. View查询
  2. Stored Procedure
  3. View查询

    join中使用Stored Procedure语句时,我只会查询加入和从连接中选择。

    我是对的吗?

    如果是这样的话 - 在优雅的代码编写方面保持良好的开发性能会是一个好的做法吗?

2 个答案:

答案 0 :(得分:0)

"伟大的发展表现"和优雅的代码"两个世界是分开的。你不应该如此密切地配对它们。

你说预先创建视图会增加一层效率低下是正确的。如果您更担心性能,那么我只是将您的联接查询直接放在您的存储过程中。从视图中查询将强制视图重新填充,这是您不需要的另一个查询。

话虽如此,一个额外的查询可能无法决定您的数据库性能。

如果您真的担心代码整洁,我建议您考虑一下您在连接语句中实际使用的数据,看看是否可以缩短它们或将它们分解。例如,您使用多列或多行数据吗?或者您只是查询单个值?如果是后者,请考虑创建一个返回此值的函数。这也有助于将代码从存储过程中分离出来。

答案 1 :(得分:0)

DBMS通常不会在您描述的情景中执行单独的查询。它以文本方式展开查询中使用的视图名称的外观,并评估整个生成的新表达式。它不会为视图评估单独的查询。使用存储过程对视图提供的操作进行分组和/或参数化(即仅通过基础/视图进行参数化,仅使用一个选择)。

话虽这么说,与通过扩展视图定义和重新排列可以获得的查询相比,您可能无法充分优化包含视图名称的查询。但无论相关查询是否在存储过程中,都是如此。

MySQL documentation。 (请注意,用户注释表明某些视图子句仅在最外面的选择表达式中阻止内联/合并。)或this dba.stackexchange.com google 'mysql view optimization' hit