Pet*_*ley 30 mysql performance database-design stored-procedures views
由于MySQL开始支持存储过程,我从未真正使用过它们.部分是因为我不是一个伟大的查询作家,部分是因为我经常与为我做出这些选择的DBA合作,部分原因是因为我对我知道的事情很满意.
在进行数据选择方面,特别是在考虑一个基本上是去规范化(连接)和聚合(avg或max,子查询和计数等)数据选择的选择时,MySQL 5.x中的正确选择是什么?一个看法?还是存储过程?
我很满意的观点 - 你知道你的SELECT查询应该是什么样的,所以你只需要创建它,确保它被编入索引,然后只做一个CREATE VIEW [View] AS SELECT [...].然后,在我的应用程序中,我将视图视为只读表 - 它表示我的规范化数据的非规范化版本.
这里有什么缺点 - 如果有的话?如果我将完全相同的SELECT语句移动到存储过程中会有什么变化(收益或损失)?
我希望在谷歌搜索这个主题时找到一些很难找到的"引擎盖"信息,但我真的很欢迎所有的评论和答案.
Chr*_*ton 12
在我看来,当需要在几个不同的应用程序中使用相同的例程或数据库或表之间的ETL时,存储过程应该仅用于数据操作,仅此而已.基本上,尽可能多地执行代码,直到您遇到DRY原则,或者您正在做的只是在数据库中将数据从一个地方移动到另一个地方.
视图可用于为数据提供备用或简化的"视图".因此,我会选择一个视图,因为您并没有真正操纵数据,就像找到一种不同的显示方法一样.
不知道这是一个选择。存储过程可以完成视图可能遇到的各种各样的事情(考虑将数据填充到临时表中,然后在其上运行游标,然后进行聚合并返回结果集)。
另一方面,视图可以隐藏复杂的sql /访问权限,并提供架构的修改视图。
我认为两者都在事物方案中占有一席之地,并且对于成功的模式实现都是有用的。
小智 5
需要注意的一件事,至少对于 mysql,视图结果存储在一个临时表中,并且与大多数体面的数据库引擎不同,该表没有索引,因此如果仅用于简化查询,当您的程序要获取所有视图的结果,但是,如果您然后根据参数搜索该视图的结果,它会非常慢,特别是如果有数百万条记录要筛选,如果视图构建在其他视图之上,则更糟,等等。
但是,存储过程可以传递这些搜索参数,并直接针对下划线(索引)表运行查询。缺点是每次运行过程时都需要获取结果,这也可能发生在视图中,具体取决于服务器配置。
所以基本上,如果您使用视图尝试尽量减少结果的数量(如果您需要搜索它),则使用存储过程。
| 归档时间: |
|
| 查看次数: |
19790 次 |
| 最近记录: |