多个临时表?

时间:2010-12-27 19:56:22

标签: mysql

这可能是一个基本问题:我在我的一些PHP代码中使用临时表,如下所示:

  1. CREATE TEMPORARY TABLE ttable( `d` DATE NOT NULL , `p` DECIMAL( 11, 2 ) NOT NULL , UNIQUE KEY `date` ( `date` ) );
  2. INSERT INTO ttable( d, p ) VALUES ( '$d' , '$p' );
  3. SELECT * FROM ttable;
  4. 随着我们扩大网站规模,这会成为一个问题吗?即,用户1的ttable& user2的ttable曾经混淆了user1看到user2的ttable&反之亦然?为每个唯一的临时表创建唯一名称是否更好?

    THX

2 个答案:

答案 0 :(得分:1)

临时表是特定于会话的。每次连接到主机时(在PHP中,这都是通过mysql_connect完成的),您创建的临时表仅存在于该会话/连接中。

答案 1 :(得分:0)

找到与使用临时表不同的方法几乎总是更好。

我唯一能考虑的是以下情况:

  1. 活动很少见。意思是,给定的用户可以每周做一次。
  2. 在定期完全导入数据之前,它用作保留容器。
  3. 它处理在填充之前结构未知的数据。
  4. 所有这三个都真正用于构建某种类型的通用批量导入例程,其中数据映射是在运行时定义的。

    如果您发现自己经常在应用程序中创建临时表,则可能有更好的方法。

    可伸缩性将取决于加载的数据量和临时表使用频率。对于低流量的网站,它可能没问题。

    我们正在通过客户端的应用程序剥离大量的临时表使用情况。系统中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子句。请注意,上述任何一项都不需要为每个邮政编码设置一个单独的表。