有什么方法可以在Go中使用MySQL Temp Tables?

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

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

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

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


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

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

你可以用下面的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 ;
链接地址: http://www.djcxy.com/p/88813.html

上一篇: Is there any way to use MySQL Temp Tables in Go?

下一篇: Debugging C++11 rvalue references with gdb