【问题标题】:Is it wise to use temporary tables?使用临时表是否明智?
【发布时间】:2011-02-13 19:06:25
【问题描述】:

我们有一个products 的 mySQL 数据库表。我们正在利用缓存层来减少数据库负载,但我们认为将需要存储在缓存层中的实际数据最小化以进一步加快应用程序的速度是个好主意。

数据库中对访问者可见的所有产品都附有价格:

价格存储在另一个名为 prices 的表中。有多个价格类别,具体取决于每个访客(客户)适用的折扣级别。不时会有活动,这意味着每种产品都有特价。特价存储在名为specials 的表中。

  • 制作一个将表绑定在一起的临时表是不是很糟糕?

它只有必要的信息,当然会被缓存。

-------------|-------------|------------ 
| productId  |  hasPrice   | hasSpecial
-------------|-------------|------------ 
  1          |  1          | 0
  2          |  1          | 1

通过这样做,很容易知道特定产品是否真的有价格,而不必在每次应该列出或展示产品时遍历完整的 pricesspecials 表。

  • 临时表是 Web 应用程序常见的东西还是只是糟糕的设计?

【问题讨论】:

  • 不错的主意。 SQL Server 有聚集索引视图,Oracle 有物化视图。它们实际上都可以满足您的需求。我很想知道 MySQL 是否有类似的结构,但我对此表示怀疑。
  • 嗨,利文。感谢您的意见。

标签: mysql performance database-design scalability temp-tables


【解决方案1】:

如果您仍然要缓存这些数据,它真的需要放在临时表中吗?只有在需要重建缓存时才会产生查询开销,因此可能甚至不需要临时表。

【讨论】:

  • 写入和保持更新缓存表的问题一直存在,但话又说回来,在将产品与临时表连接时,在第一次查询中会立即知道是否有兴趣浏览每种产品的价格/特价表?
  • @Industrial - 我认为如果你有一个临时表,陈旧数据的问题可能会更糟,因为你的缓存不仅可能是陈旧的,而且临时表的内容也可能是陈旧的- 特别是如果刷新它们的时间安排不合适。
  • 嗯,是的。缓存失效始终是任何类型缓存的主要问题。它总是归结为缓存未命中和性能之间的权衡。您认为使用这种“临时”表仍然是糟糕的数据库设计吗?
  • @Industrial - 我不会说这是糟糕的设计,只是在这种情况下可能没有必要。
【解决方案2】:

您应该像处理任何其他性能问题一样处理它:确定需要多少性能,然后在您的实验室中迭代地对生产级硬件进行测试。不要做不必要的优化。

您应该分析您的应用并发现它是否执行了太多查询或者查询本身是否很慢;大多数网络应用程序运行缓慢的情况是由于执行了太多查询(根据我的经验),即使查询非常简单。

通常最好的工程解决方案是重构数据库,在某些情况下进行非规范化,以使常见的读取用例需要更少的查询。缓存也可能有帮助,但重构以便您需要更少的查询通常是最好的。

如果您打算做更多的阅读而不是写作,那么基本上您可以增加写入路径上的工作量以减少读取路径上的工作量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2015-12-11
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多