MySQL 视图 - 使用或不使用 [关闭]

Posted

技术标签:

【中文标题】MySQL 视图 - 使用或不使用 [关闭]【英文标题】:MySQL Views - Use or Not Use [closed] 【发布时间】:2011-12-14 23:04:28 【问题描述】:

我想问一下 View 是否真的值得使用。

据我了解,视图实际上只是一个查询,每次查询视图时,视图都会再次运行自己的查询以获取最新/最新数据。

这听起来像是运行了 2 个查询。 只运行所需的查询并跳过视图不是更快吗?

请注意:我会使用简单的视图,但即使它们非常复杂,我认为同样的原则也适用。

我的视图类型 - 比如说 3 个表格,每个表格 6 列 - 每次 2 列添加到视图中,并带有几个数学方程式以稍微细化数据。

其他人是做什么的?跳过还是使用它们?

【问题讨论】:

【参考方案1】:

通常会设置视图以使选择更易于理解,同时为数据库引擎提供有关如何优化查询的指导。通过创建视图,您可以告诉数据库引擎您将经常从中进行选择,并花更多时间优化查询计划,以便从视图中进行选择会更快。这样做的好处是,当需要解析查询和计划查询时,您将节省一些执行时间,因为已经执行了优化。它可能只需您节省几毫秒,也可能非常大(对于非常大的结果集)

【讨论】:

【参考方案2】:

您说得对,视图并非旨在提高 mysql 的性能。

它们的设计目的是使基于它们的其他查询更易于阅读,并确保其他用户和程序员有更好的机会正确使用数据。将它们视为一种虚拟去规范化数据的方法,而不会对实际去规范化数据的大小/性能造成影响。

就像最简单的情况一样,我们只接受订单和订单项。每个订单都有一个订单项。

orders 表可能有以下列:

ID
Status
Created_at
Paid_on

line_items 表可能有以下列:

LI_ID
order_id
sku_id
quantity
price

您会发现,在编写代码和查询时,您将一直在执行以下连接 -

orders 
  join line_items on line_items.order_id = orders.id

这可以通过创建视图来简化:

create view 'order_lines' as 
select * from orders
  join line_items on line_items.order_id = orders.id

所以您的查询将来自:

select orders.id, sum(price) from orders
  join line_items on line_items.order_id = orders.id
  where created_at >= '2011-12-01' and created_at < '2012-01-01
  group by orders.id;

到:

select id, sum(price) from order_lines
  where created_at >= '2011-12-01' and created_at < '2012-01-01
  group by id;

数据库将以完全相同的方式执行这两种方法,但一种更易于阅读。诚然,在这种情况下,不是更容易阅读,而是更容易阅读和编码。

【讨论】:

【参考方案3】:

查询优化器通常能够将视图查询与使用视图的查询结合起来,从而只运行一个查询,因此您对视图的反对意见并不真正适用。

【讨论】:

【参考方案4】:

另见:

MySQL VIEW as performance troublemaker

View vs. Table Valued Function vs. Multi-Statement Table Valued Function

Should I use a view, a stored procedure, or a user-defined function?

问候

【讨论】:

【参考方案5】:

视图可以提供给需要直接查看数据的应用程序或用户,这些数据不一定在一个表中(或一个表中的有限字段)。这意味着他们不必了解数据及其相关性——他们只需获得所需的数据。您创建复杂的查询并对其进行优化,然后他们只使用生成的视图。

【讨论】:

以上是关于MySQL 视图 - 使用或不使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

查看类依赖图插件? [关闭]

PHP 类实例化。使用或不使用括号? [关闭]

关闭或不关闭数据库中的连接

symfony 2.0 有多稳定或不稳定? [关闭]

用户可以或不应该拥有多个电子邮件地址和电话号码? [关闭]

Android,从 MySQL 读取数据后,屏幕显示关闭后填充列表视图