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 视图 - 使用或不使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章