我一直在阅读关于MySQL中的临时表的一些内容,但对于一般的数据库,特别是MySQL,我是一个新手。我已经看了一些关于如何创建临时表的示例和MySQL文档,但我正在尝试确定临时表如何使我的应用程序受益,我猜其次是我可以遇到的各种问题。当然,每种情况都不同,但我想我正在寻找的是关于这个主题的一些一般性建议。
我做了一些谷歌搜索,但没有找到我正在寻找的主题。如果您对此有任何经验,我很乐意听到它。
谢谢, 马特
答案 0 :(得分:16)
当您想要执行相当复杂的SELECT然后对其执行一系列查询时,临时表通常很有价值...
您可以执行以下操作:
CREATE TEMPORARY TABLE myTopCustomers
SELECT customers.*,count(*) num from customers join purchases using(customerID)
join items using(itemID) GROUP BY customers.ID HAVING num > 10;
然后对myTopCustomers进行一系列查询,而不必对每个查询的购买和项目进行连接。然后,当您的应用程序不再需要数据库句柄时,不需要进行清理。
几乎总是会看到用于派生表的临时表,这些表的创建成本很高。
答案 1 :(得分:11)
首先是免责声明 - 我的工作是报告,所以我最终会得到比普通开发人员更复杂的查询。如果你正在编写一个简单的CRUD(创建读取更新删除)应用程序(这将是大多数Web应用程序),那么你真的不想编写复杂的查询,如果你需要创建临时表,你可能做错了。
也就是说,我在Postgres中使用临时表有很多用途,而且大多数都会转换为MySQL。我用它们将复杂的查询分解成一系列可以理解的部分。我使用它们来保持一致性 - 通过一系列查询生成一个复杂的报告,然后我可以将其中的一些查询卸载到我在多个地方使用的模块中,我可以确保不同的报告彼此一致。 (并确保如果我需要修复某些内容,我只需要修复一次。)而且,很少,我故意使用它们强制执行特定的查询计划。 (除非你真的明白自己在做什么,否则不要试试这个!)
所以我认为临时表很棒。但是那样说,了解数据库通常有两种形式,这对非常重要非常重要。第一个是针对大量小型交易进行优化的,另一个针对抽出少量复杂报告进行了优化。这两种类型需要进行不同的调整,并且在事务数据库上运行的复杂报表会存在阻塞事务的风险(因此会使网页无法快速返回)。因此,您通常不希望避免将两个数据库用于这两个目的。
我的猜测是你正在编写一个需要事务数据库的Web应用程序。在这种情况下,您不应该使用临时表。如果您确实需要从事务数据生成复杂报告,建议的最佳做法是定期(例如每日)备份,在另一台计算机上还原它们,然后针对该计算机运行报告。
答案 2 :(得分:4)
使用临时表的最佳位置是,您需要从多个表中提取大量数据,对该数据执行一些操作,然后将所有内容组合到一个结果集中。
在MS SQL中,由于与游标相关的速度和资源影响,也应尽可能使用临时表来代替游标。
答案 3 :(得分:3)
如果您不熟悉数据库,Joe Kelko有一些好书可以回顾ANSI SQL的最佳实践。 SQL For Smarties将详细描述临时表的使用,索引的影响,where子句等。这是一本非常详细的参考书。
答案 4 :(得分:1)
我以前在需要创建评估数据时使用过它们。那是在MySQL的视图和子选择之前,我现在通常使用那些我需要临时表的地方。我唯一可以使用它们的方法是评估数据需要很长时间才能创建。
答案 5 :(得分:1)
我还没有在MySQL中完成它们,但我已经在其他数据库(Oracle,SQL Server等)上完成了它们。
在其他任务中,临时表为您提供了一种创建可查询(并且可以从sproc返回)数据集的方法,该数据集是专门构建的。假设您有几个数字表 - 您可以使用临时表将这些数字滚动到漂亮,干净的总计(或其他数学),然后将该临时表连接到模式中的其他人以获得最终输出。 (在我的一个项目中,一个例子是计算给定的销售相关员工每周必须进行的预定呼叫次数,每两周,每月等)。
我还经常使用它们作为“倾斜”数据的方法 - 将列转换为行等。它们适用于高级数据处理 - 但只在需要时才使用它们。 (我的黄金法则一如既往地适用:如果您不知道为什么使用 x ,而您不知道 x 是如何工作的,那么您可能不应该使用它。)
一般来说,我最常在sprocs中使用它们,在那里需要复杂的数据处理。我想给出一个具体的例子,但我的是T-SQL(而不是MySQL更标准的SQL),而且它们都是我无法分享的客户端/生产代码。我相信SO上的其他人会拿起并提供一些真正的示例代码;这只是为了帮助您了解域临时表所解决的问题的主旨。