【问题标题】:A persistent temporary table?一个持久的临时表?
【发布时间】:2013-06-04 18:06:11
【问题描述】:

现在,我在选择查询中使用临时表来加快执行速度。每次执行查询时都会创建它们。

在我目前的情况下,表每天只更新一次新数据,所以我在想,我将创建一个持久表,而不是使用 MySQL 的 CREATE TEMPORARY TABLE 语句,从某种意义上说是 temporary,因为它会在一天后被删除并重新创建。在我完成更新主表之后,我可以用 临时 数据填充它。

或者,InnoDB's data buffer 是否足够聪明,可以缓存临时表本身的数据?

或者还有其他缓存临时表的方法吗?

我还发送了适当的缓存标头以及使用 AJAX 加载的数据以减少服务器负载,并且 AJAX 查询占发送到 mysql 的读取请求的大约 70%。

我的想法只是浪费磁盘空间,而表永远不应该以这种方式使用,还是对我的情况来说这是一个非常好的主意?

【问题讨论】:

  • 在多用户环境中,临时表不是一个好主意,因为它们只对创建它们的连接可见。我建议您为当天创建“真实”表,并在每天结束时使用“截断表”,您将数据保存到持久表之后
  • 是的,我也是这么想的,因为临时表的数据一天都不会改变!
  • 另一个细节...如果数据非常不稳定并且主要任务是添加数据,我建议您使用 MyISAM 表,因为它们对于此类任务更快(当然,您必须做一些额外的工作来保持参照完整性,但也许额外的速度是值得的)
  • 让 MySQL 做缓存。它应该足够聪明,可以缓存经常请求的内容。

标签: mysql sql innodb temp-tables


【解决方案1】:

我最近遇到了一个类似的问题,即 CREATE TEMPORARY TABLE 由于不断重复使用而付出了巨大的代价。我还使用了 Barranka 描述的解决方案(创建一次并在完成或重用之前截断)。

为了进一步提高性能,我使用了在 RAM 磁盘 (ramfs) 上创建的 InnoDB 表。这以非常低的 IO 成本提供了 InnoDB 存储引擎的所有优势。这是一个比使用 MEMORY 存储引擎更好的解决方案,根据 Oracle 支持,该引擎仅适用于旧版应用程序,并且有一段时间没有得到改进或扩展。

【讨论】:

    【解决方案2】:

    也许看看 MEMORY 存储引擎可能会有所帮助?我将这些用于每天一次密集查询中的一些接受数据,然后在短时间内密集使用 MEMORY 表。

    http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多