【问题标题】:Is there any way to use MySQL Temp Tables in Go?有没有办法在 Go 中使用 MySQL 临时表?
【发布时间】:2015-11-07 01:49:24
【问题描述】:

我有创建临时表的存储过程。然后我想执行一个与这些临时表连接的查询。

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

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

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

【问题讨论】:

  • 即使是临时表?那么Golang中没有办法使用临时表吗?
  • 文档表明创建临时表不会执行隐式提交 (dev.mysql.com/doc/refman/5.6/en/implicit-commit.html),但是无法像以前那样向它们添加索引。
  • MySQL 中的临时表只对当前连接可见。一旦该连接关闭,它们就会被丢弃。如果您使用的是临时表,则必须在开展业务时保持该连接。
  • 是的,我认为你被困在一个事务中完成所有工作。直接来自 Golang 文档:“一旦调用 DB.Begin,返回的 Tx 就会绑定到单个连接。一旦对事务调用 Commit 或 Rollback,该事务的连接就会返回到 DB 的空闲连接池。”由于临时表仅对每个连接可见,因此您只能这样做。使用完临时表后,请务必清理它们,否则它们会持续存在,并且可能会混淆该池连接的下一个毫无戒心的继承者......
  • 仅作记录:我删除了建议创建一个只有 1 个连接的新 sql.DB 的答案,因为这似乎行不通 (groups.google.com/d/msg/golang-dev/RWmOv4SYUmc/SYVuaZazQGwJ)

标签: mysql go innodb


【解决方案1】:

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

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

可以用下面的sql创建内存表;

CREATE TABLE mydb.temp_32rfd293 (
  id int(11) auto_increment,
  content varchar(50),
  PRIMARY KEY  (`id`)
) ENGINE=MEMORY;

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

DROP TABLE temp_32rfd293:

计划的事件以删除 1 天以前的 mydb.temp_% 表

你会想要清理偶尔被遗弃的临时表,你可以在 mysql 中创建一个计划的事件来做到这一点。如果您选择这样做,请考虑为临时表使用专用架构以防止意外删除。

注意:您需要在 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 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多