这可能是一个基本问题:我在我的一些PHP代码中使用临时表,如下所示:
CREATE TEMPORARY TABLE ttable( `d` DATE NOT NULL , `p` DECIMAL( 11, 2 ) NOT NULL , UNIQUE KEY `date` ( `date` ) );
INSERT INTO ttable( d, p ) VALUES ( '$d' , '$p' );
SELECT * FROM ttable;
随着我们扩大网站规模,这会成为一个问题吗?即,用户1的ttable& user2的ttable曾经混淆了user1看到user2的ttable&反之亦然?为每个唯一的临时表创建唯一名称是否更好?
THX
答案 0 :(得分:1)
临时表是特定于会话的。每次连接到主机时(在PHP中,这都是通过mysql_connect完成的),您创建的临时表仅存在于该会话/连接中。
答案 1 :(得分:0)
找到与使用临时表不同的方法几乎总是更好。
我唯一能考虑的是以下情况:
所有这三个都真正用于构建某种类型的通用批量导入例程,其中数据映射是在运行时定义的。
如果您发现自己经常在应用程序中创建临时表,则可能有更好的方法。
可伸缩性将取决于加载的数据量和临时表使用频率。对于低流量的网站,它可能没问题。
我们正在通过客户端的应用程序剥离大量的临时表使用情况。系统中90%的查询会导致创建临时表。对所有查询的分析表明,原始开发人员使用这种机制只是因为他们不了解SQL。我们这样做是因为随着新用户被添加到系统中,性能急剧下降。
你可以发一个用例吗?也许我们可以帮助提供另一种机制。
<强>更新强>
现在我们有一个用例,这里有一个简单的表结构来完成你需要的东西。
表ZipCodes
ZipCode char(5)[或char(10)根据需要]
CityName varchar(50)
*必要时的其他栏目,如纬度或其他。
表TempReadings
ZipCode char(5)[ZipCode表的外键]
ReadingDate日期时间
温度漂浮(或某些等效物)
要获得给定邮政编码的所有临时读数,您可以执行以下操作:
select ZipCode, ReadingDate, Temperature
from TempReadings
如果您需要ZipCode主表中的信息:
select Z.ZipCode, Z.CityName, TR.ReadingDate, TR.Temperature
from ZipCodes Z
inner join TempReadings TR on (TR.ZipCode = Z.ZipCode)
根据需要添加where子句。请注意,上述任何一项都不需要为每个邮政编码设置一个单独的表。