【问题标题】:Is there anything wrong with nested Views in MySQLMySQL中的嵌套视图有什么问题吗
【发布时间】:2012-01-11 19:27:01
【问题描述】:

让一个视图引用另一个视图有什么问题吗?例如,假设我有一个 用户表

CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

然后为了论证,一个只显示所有用户的视图

CREATE VIEW all_users AS SELECT * FROM users

然后是只返回他们的 first_namelast_name

的视图
CREATE VIEW full_names AS SELECT first_name, last_name FROM all_users

基于另一种观点是否存在性能问题?让我们也假设这是最简单的示例,而现实世界的场景会复杂得多,但基于另一个视图的一个视图的相同一般概念。

【问题讨论】:

  • 通常性能比直接对表执行 Select 更差,但您最好尝试一下,看看它是否适合您的用例。
  • 删除 PRIMARY KEY (id) 后的分号。也将 OT NULL 更改为 NOT NULL

标签: mysql sql performance database-design views


【解决方案1】:

这取决于使用的ALGORITHM。 TEMPTABLE 可能非常昂贵,而 MERGE 应该与直接使用表相同,因此不会有任何损失。

【讨论】:

    【解决方案2】:

    你的例子也是一样的:

    mysql> explain select * from users;
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    | id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra               |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    |  1 | SIMPLE      | users | system | NULL          | NULL | NULL    | NULL |    0 | const row not found |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    1 row in set (0.01 sec)
    
    mysql> explain select * from all_users;
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    | id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra               |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    |  1 | SIMPLE      | users | system | NULL          | NULL | NULL    | NULL |    0 | const row not found |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    1 row in set (0.00 sec)
    
    mysql> explain select * from full_names ;
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    | id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra               |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    |  1 | SIMPLE      | users | system | NULL          | NULL | NULL    | NULL |    0 | const row not found |
    +----+-------------+-------+--------+---------------+------+---------+------+------+---------------------+
    1 row in set (0.02 sec)
    

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多