MySQL临时表性能

时间:2013-08-20 18:02:11

标签: mysql sql

这是我的情况:

我正在构建一个产品目录系统,该系统有许多搜索条件,可以由用户通过直接请求或用户的权限,位置或其他元数据添加。

  1. 有一个主查询正在进行繁重的工作,它相当大并且包含可变数量的子查询以使魔法发生。查询返回9列,其中没有一列包含太多数据,其中一些通常只是空。

  2. 我需要在其后的几个其他查询中访问此查询的结果数据(例如,对结果数据进行排序,应用第二层过滤器,分页,选择备用过滤器选项)。

  3. 在PHP方面,我只需要25个项目的分页结果,所以我想将数据库数据保存在数据库中。

  4. 我正在使用的解决方案是创建一个临时表,然后在其中插入/选择数据。

    CREATE TEMPORARY TABLE `tmp_table`
    (
        `col1` bigint(20) NOT NULL,
        `col2` int(11) NOT NULL,
        `col3` varchar(16) NOT NULL,
        `col4` decimal(10,2) NULL,
        `col5` decimal(10,2) NULL,
        `col6` decimal(10,2) NULL,
        `col7` decimal(10,2) NULL,
        `col8` decimal(10,2) NULL,
        `col9` tinyint(1) NULL,
        `col10` int(11) NULL,
        `col11` int(11) NULL
    ) ENGINE=MEMORY;
    
    INSERT INTO `tmp_table` (col1, col2, etc.)
    SELECT [...large query]
    

    问题:大型查询本身在< 0.3s,但是添加临时表插入会在3.5s~5.0s之间推动执行

    我已经尝试过MEMORY,InnoDB和MyISAM作为表引擎,所有这些都有类似的结果。

    我在临时表上尝试使用和不使用索引,这似乎也不会影响执行时间。

    结果集50或500的执行时间几乎相同。

    我的问题:这种做法不合适吗?我应该关注哪些MySQL配置变量来提高性能?有没有更好的解决方案,我忽略了?

1 个答案:

答案 0 :(得分:0)

您可以为会话表添加另一列会话ID,并将其设置为非临时。然后第一个查询只会将其数据插入此表中,并且有时会清除它以删除过期会话的数据。这避免了为每个请求创建表的开销。

在插入之前,您可能会删除所有会话特定数据。