我正在为我正在开发的应用程序设计我的mysql数据库。
我喜欢Stored Procedures
简短易读,而且因为我的数据库涉及一些join
语句,我想也许我应该创建Views
所有joins
和从我的Views
查询这些Stored Procedures
。
起初这听起来很棒,但是当我谈到性能时,我意识到无论何时调用Stored Procedure
它都会运行至少2个查询:
View
查询Stored Procedure
View
查询
醇>
在join
中使用Stored Procedure
语句时,我只会查询加入和从连接中选择。
我是对的吗?
如果是这样的话 - 在优雅的代码编写方面保持良好的开发性能会是一个好的做法吗?
答案 0 :(得分:0)
"伟大的发展表现"和优雅的代码"两个世界是分开的。你不应该如此密切地配对它们。
你说预先创建视图会增加一层效率低下是正确的。如果您更担心性能,那么我只是将您的联接查询直接放在您的存储过程中。从视图中查询将强制视图重新填充,这是您不需要的另一个查询。
话虽如此,一个额外的查询可能无法决定您的数据库性能。
如果您真的担心代码整洁,我建议您考虑一下您在连接语句中实际使用的数据,看看是否可以缩短它们或将它们分解。例如,您使用多列或多行数据吗?或者您只是查询单个值?如果是后者,请考虑创建一个返回此值的函数。这也有助于将代码从存储过程中分离出来。
答案 1 :(得分:0)
DBMS通常不会在您描述的情景中执行单独的查询。它以文本方式展开查询中使用的视图名称的外观,并评估整个生成的新表达式。它不会为视图评估单独的查询。使用存储过程对视图提供的操作进行分组和/或参数化(即仅通过基础/视图进行参数化,仅使用一个选择)。
话虽这么说,与通过扩展视图定义和重新排列可以获得的查询相比,您可能无法充分优化包含视图名称的查询。但无论相关查询是否在存储过程中,都是如此。
见MySQL documentation。 (请注意,用户注释表明某些视图子句仅在最外面的选择表达式中阻止内联/合并。)或this dba.stackexchange.com google 'mysql view optimization' hit。