1

我有 2 张桌子:

  • t_cities( idCity, idCountry, name, population)
  • t_countries( idCountry, name)

t_cities有 50000 行,所以我用英国的城市创建了一个视图(只有 1100 个):

CREATE VIEW v_city_uk AS SELECT * FROM t_cities WHERE idCountry = 140

到目前为止一切都很好,我得到了一个 1100 行的视图。
查询

SELECT COUNT(*) FROM v_city_uk

返回 1100,但解释:

EXPLAIN SELECT COUNT(*) FROM v_city_uk

表示它正在检查 50000 行以执行此查询。为什么?
有没有办法让这不会发生?因为我创建视图以加快查询速度,所以不一样。


编辑:感谢 matthewdavidson,我需要一个“汇总表”。

4

1 回答 1

2

因为视图不是预编译查询或存储结果,所以它是预定义查询。它每次执行视图中的 SELECT 语句。否则,视图将永远不会更新。视图是查询的表示。它对程序员来说是一种方便的简写,但对机器来说却不是。

换句话说,当你

SELECT something FROM YourView

而 YourView 定义为

CREATE VIEW YourView AS SELECT stuff FROM sometable 
INNER JOIN othertable ON sometable.column = othertable.column

实际运行的是

 SELECT something FROM 
(SELECT stuff FROM sometable 
INNER JOIN othertable ON sometable.column = othertable.column)

如果要存储结果,则应使用聚合表。

于 2012-06-06T04:16:57.543 回答