繁体   English   中英

MySQL临时表性能

[英]MySQL Temp Table Performance

这是我的情况:

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

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

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

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

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

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配置变量吗? 有没有被我忽略的更好的解决方案?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM