【问题标题】:Is there a way to cache a View so that queries against it are quick?有没有办法缓存视图以便快速查询?
【发布时间】:2013-05-17 06:24:21
【问题描述】:

我对 Views 非常陌生,所以如果这是一个愚蠢的问题,请原谅我,但我有一个 View 对优化相当笨拙的查询非常有帮助,并允许我在然而,我希望 View 会真正存储在某个地方,这样选择它就不会花费很长时间。

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

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

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

TIA

【问题讨论】:

  • 所以你想要的是一个物化视图,而不是 mysql 提供的视图,它只是一个巨大查询的别名。从 mysql 5.1 开始,针对视图的 SELECT 查询被缓存,因此任何后续查询都应​​该很快。究竟是什么东西在这里不适合你?您是否在创建视图的查询中使用子查询?
  • 我正在使用一个巨大的查询,在我的 VIEW 中有许多子选择,而且它似乎根本没有缓存。作为概念证明,我简单地调用了select count(id) from myView,如果 myView 的结果被缓存,我认为它应该非常活泼,但可惜它需要的时间与针对它的任何其他查询一样长。我的视图有子选择的问题吗? (我不确定这是否是子查询的意思,或者是否有区别)。
  • 子选择或子查询 - 所以我们在谈论同样的事情。 MySQL 使用自己的查询缓存。比如说,我们有一个 1 百万行的表,你像 select count(*) 一样查询它 - 第一次会很慢,第二次会是瞬时的,因为它会提取缓存的数据。相同的规则适用于视图,不同之处在于 MySQL 不缓存子选择结果。这意味着如果您有子选择,您从视图中获得的结果不会被 MySQL 内部缓存。因此,如果您愿意,它将始终从头开始运行查询。这就是为什么您的视图会变慢。
  • 您可以做的当然是优化您用于创建视图的查询中涉及的表。视图基本上只是一个别名,因此您不必键入数十个 JOIN 等,这意味着您想要的视图不是物化的。您可以选择从视图中创建一个表并复制该表中的数据(具体化视图),或者您可以优化 MySQL 引擎设置和原始查询。看到没有足够的信息,没有看到查询和索引就无能为力了。
  • 不幸的是,视图是一个数据透视表,所以我无法避免子选择(因为它是来自同一个表的几十个子选择,针对特定的 user_ids)。听起来物化是我唯一的选择。我将暂时处理 2 分钟的选择,看看随着时间的推移情况是否会变得更糟。再次感谢您的信息。

标签: mysql view


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    由于视图基本上是一个SELECT 语句,您可以使用query cache 来提高性能。

    但首先你应该检查是否:

    • 您可以在涉及的表中添加索引以加快查询速度(使用EXPLAIN
    • 数据不会经常更改,您可以将视图具体化(制作快照)

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 具有讽刺意味的是,我真的不希望缓存的 *table 永远改变。我正在做类似select * where date between x and y 这样的事情,所以我的缓存表代表了一组固定的数据,这些数据根本不会发生变化。我只是希望能够根据这些数据快速选择。
      【解决方案4】:

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

      【讨论】:

      • hmm... 很好地基于该教程,在 mySQL 中,物化视图看起来有点像夏天。我希望它就像在我的视图创建中添加一些关键字一样简单。哦,好吧......谢谢你让我知道它叫什么! :)
      • @Dr.Dredel:您总是可以迁移到 DB2,在这种情况下,只需添加一个单词就可以 实现这样的野兽。但是,您可能不认为值得付出代价:-)
      • 遗憾的是,目前我们无法选择 :)
      • 正是我想要的!谢谢
      • 你不想靠近 DB2。
      猜你喜欢
      • 1970-01-01
      • 2012-02-18
      • 2022-01-28
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多