为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
精慕HU 2021-11-22 15:02:46
我有创建临时表的存储过程。然后我想执行一个连接这些临时表的查询。问题在于,在 Golang 的 database/sql 设计中,确保后续查询获得相同连接的唯一方法是创建事务。如果我为了访问临时表而将大部分 SELECT 包装在事务中,我是否自找麻烦?我知道我会失去一些性能/可扩展性,因为我将保持池中的连接而不是允许它们在查询之间返回。但我想知道我是否会开始看到此策略的锁定或其他严重问题。我需要这样做的原因是因为我的许多表的 MySQL 执行计划非常糟糕(我正在跨大表进行多个连接)。我想执行一些中间查询并将它们的结果存储在临时表中以避免这个问题。
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

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


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


可以用下面的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 中创建一个计划事件来执行此操作。如果您选择这样做,请考虑对临时表使用专用架构以防止意外删除。


注意:您需要event_scheduler=ON在 my.ini 中进行此操作。


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 ;


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信