MySQL视图 - 使用或不使用

时间:2011-12-14 23:04:29

标签: mysql views

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

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

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

请注意:我会使用简单的视图,但即便如此,我认为相同的原则也适用。

我的视图类型 - 比如3个表格,每个表格有6列 - 每次2列都会添加到视图中,并带有几个数学方程式来优化数据触摸。

其他人做了什么?跳过或使用它们?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

查询优化器通常能够将视图查询与使用视图的查询组合在一起,使得只运行单个查询,因此您对视图的异议并不真正适用。

答案 2 :(得分:1)

你认为视图不是MySQL的性能优势。

他们的目的是让构建在其上的其他查询更易于阅读,并确保其他用户和程序员更有可能正确使用数据。可以将它们看作是一种虚拟去标准化数据的方法,而不会影响实际对数据进行非规范化的大小/性能。

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

订单表可能包含以下列:

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;

DB将以完全相同的方式执行这两种方式,但更容易阅读。不可否认,在这种情况下,阅读和阅读都不容易,但更容易阅读和编码。

答案 3 :(得分:1)

答案 4 :(得分:0)

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