MySQL:视图与存储过程

Posted

技术标签:

【中文标题】MySQL:视图与存储过程【英文标题】:MySQL: Views vs Stored Procedures 【发布时间】:2010-10-15 12:23:02 【问题描述】:

自从 mysql 开始支持存储过程以来,我从未真正使用过它们。部分原因是我不是一个出色的查询编写者,部分原因是我经常与为我做出这些选择的 DBA 一起工作,部分原因是我只是对我所知道的感到满意。

在进行数据选择方面,特别是在考虑本质上是数据的非规范化(连接)和聚合(平均或最大值,子查询/计数等)选择时,MySQL 中的正确选择是什么5.x?一个看法?还是存储过程?

我喜欢的视图 - 你知道你的 SELECT 查询应该是什么样子,所以你只需创建它,确保它被索引等等,然后只需执行 CREATE VIEW [View] AS SELECT [...]。然后,在我的应用程序中,我将视图视为只读表 - 它表示我的规范化数据的非规范化版本。

这里有什么缺点 - 如果有的话?如果我将完全相同的 SELECT 语句移动到存储过程中会发生什么变化(收益或损失)?

我希望找到一些在谷歌搜索该主题时很难找到的“幕后”信息,但我真的欢迎所有 cmets 和答案。

【问题讨论】:

对于碰巧找到这篇文章但觉得这些答案不太适合您的任何其他人,MSDN Social 上有一些出色的评论,确实有助于更深入地了解基础知识。 【参考方案1】:

在我看来,当需要在多个不同的应用程序之间使用相同的例程或用于数据库或表之间的 ETL 时,存储过程应该仅用于数据操作,仅此而已。基本上,在您遇到 DRY 原则或您所做的只是将数据从数据库中的一个地方移动到另一个地方之前,尽可能多地使用代码。

视图可用于为数据提供替代或简化的“视图”。因此,我会选择一种观点,因为您并没有真正操纵数据,而是寻找一种不同的显示方法。

【讨论】:

这一切都很好,直到您遇到具有 >100k 记录的数据集并且您需要在子集中使用 COUNT(*)。存储过程同样适用于收集数据,这有时是必要的。【参考方案2】:

不确定这是否是非此即彼的选择。存储过程可以完成视图难以完成的各种事情(想想在临时表中填充数据,然后在其上运行游标,然后进行聚合并返回结果集)。

另一方面,视图可以隐藏复杂的 sql / 访问权限并呈现模式的修改视图。

我认为两者都在事物方案中占有一席之地,并且对于成功的架构实施都很有用。

【讨论】:

【参考方案3】:

我使用视图进行反规范化或输出格式化,并使用存储过程进行过滤和数据操作(需要参数输入的事物)或迭代(光标)。

当需要去规范化和过滤时,我经常访问存储过程中的视图。

【讨论】:

【参考方案4】:

有一点需要注意,至少 mysql 的视图结果存储在一个临时表中,并且与大多数体面的数据库引擎不同,该表没有索引,所以如果仅用于简化查询,当您的程序要抓取时,视图非常有用视图的所有结果,但是,如果您随后根据参数搜索该视图的结果,则速度非常慢,尤其是在要筛选数百万条记录的情况下,如果视图建立在其他视图之上,则更糟,并且以此类推。

一个存储过程,但是您可以将这些搜索参数传入并直接针对下划线(索引)表运行查询。缺点是每次运行过程时都需要获取结果,这也可能发生在视图中,具体取决于服务器配置。

所以基本上,如果您使用视图尝试最小化结果数量(如果您需要搜索它),则使用存储过程。

【讨论】:

以上是关于MySQL:视图与存储过程的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 索引&视图&存储过程

sql 视图 存储过程 的区别?

MYSQL数据太大时怎么优化 视图?存储过程? - 技术问答

SQL存储过程做成视图

MySQL视图事务与存储过程

MySQL 之 视图触发器存储过程函数事物与数据库锁