【问题标题】:Functionality of VIEW's with WHEREVIEW 与 WHERE 的功能
【发布时间】:2012-10-11 09:50:12
【问题描述】:

我正在尝试了解有关 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 的用户的角色/状态 - 所以我必须在VIEW 上再添加一个SELECTWHERE id = 3,对吗?但如果我这样做,究竟会发生什么?

VIEW还是SELECT所有用户,然后整个数据会被丢弃,只显示id = 3?还是会优化让VIEW只选择user.id = 3

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

那么VIEW 究竟是如何运作的呢?作为简单的 SUBQUERY,还是在选择 VIEW 时添加 WHERE 会更优化?

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

感谢您的信息

【问题讨论】:

    标签: mysql performance view where


    【解决方案1】:

    会优化的。

    您可以将视图视为宏或别名。在运行时,当您使用视图时,视图的整个 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
    

    【讨论】:

    • 非常感谢,我希望会是这样!
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多