MySQL 临时表性能

标签 mysql sql

这是我的情况:

我正在构建一个产品目录系统,其中包含大量搜索条件,用户可以通过直接请求或用户权限、位置或其他元数据添加这些条件。

  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.3 秒内执行,但是添加临时表插入将执行时间推到 3.5 到 5.0 秒之间

我尝试过 MEMORY、InnoDB 和 MyISAM 作为表引擎,结果都差不多。

我试过在临时表上使用和不使用索引,这似乎也不会对执行时间产生太大影响。

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

我的问题:这种做法不合适吗?是否应该查看任何 MySQL 配置变量以提高性能?是否有我忽略的更好的解决方案?

最佳答案

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

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

关于MySQL 临时表性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18341960/

相关文章:

mysql - 如果我使用 IN 运算符来过滤 NULL 值和空格 它不起作用 为什么?

php - 如果用户已登录,登录页面无法重定向到另一个页面

sql - 两个内部连接 ​​MYSQL

mysql - 非常简单的 MySQL INNER JOIN 失败

sql - 如何在表上选择并计算某些值的出现次数

android - 选择回收者 View 的特定行以共享 Intent

mysql - mysql中按时间范围分组查询产生错误

php - mysql_query() 期望参数 2 是资源, bool 值给出

Mysql 选择一个字段值或其逆值(之二)

mysql - 向 mysql 表中插入 100 个递增的行