VIEW与WHERE的功能

时间:2012-10-11 09:50:13

标签: mysql performance view where

我正在尝试了解更多关于MySQL VIEW的内容,我仍然很困惑(特别是关于细节)

如果我做对了,视图不会比使用的存储SELECT查询更多。但是当我想在VIEW中使用WHERE子句的某些值时,我的问题就开始了。

让我们假设,我们有这个视图:

SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status`
FROM `user`
LEFT JOIN `userrole`
ON `userrole`.`id` = `user`.`userrole_id`
LEFT JOIN `userstatus`
ON `userstatus`.`id` = `user`.`userstatus_id`

现在,这将提供所有用户的列表及其当前角色/状态

+----+-------+--------+
| id |  role | status |
+----+-------+--------+
|  1 | admin | active |
|  2 |  user | active |
|  3 |  user | active |
|  4 | admin | active |
| .. |   ... |    ... |
+----+-------+--------+

现在,我只想知道ID 3用户的角色/状态 - 所以我必须在SELECT上使用{{VIEW进行额外的WHERE id = 3 1}},对吗?但如果我这样做,究竟会发生什么?

VIEW仍然会SELECT所有用户,然后整个数据都会被删除,只会显示id = 3吗?或者是否会对其进行优化,以便VIEW仅选择user.id = 3

我对此的性能方面感到困惑 - 因为如果我有100万用户,使用VIEW这将是一个相当糟糕的主意。但另一方面,如果我有SELECT,我会保留自己每次JOIN使用整个VIEW

那么VIEW究竟是怎么做的?简单的SUBQUERY,或者在选择WHERE时添加VIEW是否更优化?

我想如果它像SUBQUERY一样,带参数的STORED PROCEDURE总是比VIEW更好,那么(如果WHERE个参数有所不同)?

感谢您提供的信息

1 个答案:

答案 0 :(得分:2)

将进行优化。

您可以将视图视为宏或别名。在运行时,当您使用视图时,视图的整个SQL文本将扩展为使用该视图的查询。然后,查询优化器仅选择组合查询中实际使用的那些列和行。

如果您输入

SELECT `id`, `role` FROM YourView
WHERE `status` = 4

它将扩展为

SELECT `id`, `role` FROM 
(
SELECT `user`.`id`, `userrole`.`key` AS `role`, `userstatus`.`key` AS `status`
FROM `user`
LEFT JOIN `userrole`
ON `userrole`.`id` = `user`.`userrole_id`
LEFT JOIN `userstatus`
ON `userstatus`.`id` = `user`.`userstatus_id`
)
WHERE `status` = 4