35

我对 Views 非常陌生,所以如果这是一个愚蠢的问题,请原谅我,但是我有一个 View 对优化非常笨拙的查询非常有帮助,并且允许我选择 View 中的一小部分列,但是,我希望视图实际上会存储在某个地方,这样选择它就不会花费很长时间。

我可能弄错了,但我感觉(从create view执行速度和我对视图的查询持续时间)每次我选择它时,视图实际上都是在外部查询之前作为查询运行的。

我真的希望我忽略了一些机制,当我运行 CREATE VIEW 时,它可以完成查询 View 查询 *then 的艰苦工作,这样我随后对这个静态视图的选择就会非常迅速。

顺便说一句,我完全理解,显然这个 VIEW 将是创建 VIEW 时存在的数据的快照,并且不会反映在 VIEW 创建之后插入/更新的任何新信息。这实际上正是我所需要的。

TIA

4

4 回答 4

23

你要做的就是将你的观点具体化。看看http://www.fromdual.com/mysql-materialized-views

于 2013-05-22T09:07:48.450 回答
2

你所说的是物化视图,据我所知,这是(至少)DB2 的一个特性,但不是 MySQL 的特性。

有一些方法可以通过定期或按需创建/填充表来模拟它们,但真正的物化视图知道底层数据何时发生变化,并且仅在需要时重新计算。

如果创建视图后数据永远不会改变(正如您在评论中所指出的那样),只需创建一个全新的表来保存数据子集并查询它。人们总是抱怨速度慢,但很少抱怨数据存储要求:-)

于 2013-05-22T09:08:05.173 回答
0

由于视图基本上是一条SELECT语句,因此您可以使用查询缓存来提高性能。

但首先你应该检查是否:

  • 您可以在所涉及的表中添加索引以加快查询速度(使用EXPLAIN
  • 数据不会经常变化,您可以物化视图(制作快照)
于 2013-05-22T09:13:11.060 回答
0

使用物化视图。它可以存储计数和等数据,但是在更新表后,您需要刷新视图以获得正确的结果,因为它们不会自动更新。此外,从视图查询后,结果将存储在缓存中,因此在从表本身查询的情况下,内存周期减少到 2,即 4。所以它从第二次开始变得高效。当你从视图中第一次查询时,数据是从主内存中获取的,然后存储在缓存中。

于 2018-07-20T03:19:41.530 回答