有没有办法在 Go 中使用 MySQL 临时表?

Is there any way to use MySQL Temp Tables in Go?

我有创建临时 tables 的存储过程。然后我想执行一个与这些 temp tables.

连接的查询

问题在于,使用 Golang 的 database/sql 设计,确保为后续查询获得相同连接的唯一方法是创建一个事务。

如果我为了访问临时文件而将大部分 SELECT 包装在一个事务中,我是在自找麻烦吗?table?我知道我会失去一些 performance/scalability,因为我会保留池中的连接,而不是让它们在查询之间返回。但我想知道我是否会开始看到此策略的锁定或其他严重问题。

我需要这样做的原因是因为我的许多 tables 的 MySQL 执行计划非常糟糕(我正在对大型 tables 进行多次连接).我想执行一些中间查询并将它们的结果存储在临时 tables 中以避免这个问题。

您可以创建自己的伪临时 table 可以被多个进程和连接访问。

想法是简单地创建内存 tables,运行 你的操作,然后清理。

您可以通过以下sql;

创建一个内存table
CREATE TABLE mydb.temp_32rfd293 (
  id int(11) auto_increment,
  content varchar(50),
  PRIMARY KEY  (`id`)
) ENGINE=MEMORY;

做一些有用的事情,然后使用;

DROP TABLE temp_32rfd293:

要删除 mydb.temp_% table 超过 1 天的预定事件

您需要清理偶尔被遗弃的临时文件 table,您可以在 mysql 中创建一个预定事件来执行此操作。如果您选择这样做,请考虑为临时 tables 使用专用架构以防止意外删除。

注意:您的 my.ini 中需要 event_scheduler=ON 才能正常工作。

DELIMITER $$

CREATE
  EVENT `cleanup_custom_temps`
  ON SCHEDULE EVERY 1 DAY STARTS '2000-01-01 01:00:00'
  DO BEGIN


  ---------------------------------------------------
  -- Process to delete all tables with
  -- prefix 'temp_', and older than 1 day
  SET @tbls = (
    SELECT GROUP_CONCAT(TABLE_NAME)
      FROM information_schema.TABLES
      WHERE TABLE_SCHEMA = 'mydb'
        AND TABLE_NAME LIKE 'temp_%'
          AND CREATE_TIME < NOW() - INTERVAL 1 DAY
  );
  SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
  PREPARE stmt FROM @delStmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
  ---------------------------------------------------

  END */$$

DELIMITER ;