猿问

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

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

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

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

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


精慕HU
浏览 172回答 1
1回答

哆啦的时光机

您可以创建自己的伪临时表,多个进程和连接可以访问这些表。这个想法是简单地创建内存表,运行你的操作,然后清理。可以用下面的sql创建内存表;CREATE TABLE mydb.temp_32rfd293 (&nbsp; id int(11) auto_increment,&nbsp; content varchar(50),&nbsp; PRIMARY KEY&nbsp; (`id`)) ENGINE=MEMORY;做一些有用的事情,然后使用;DROP TABLE temp_32rfd293:删除 1 天前的 mydb.temp_% 表的预定事件您需要清理偶尔被遗弃的临时表,您可以在 mysql 中创建一个计划事件来执行此操作。如果您选择这样做,请考虑对临时表使用专用架构以防止意外删除。注意:您需要event_scheduler=ON在 my.ini 中进行此操作。DELIMITER $$CREATE&nbsp; EVENT `cleanup_custom_temps`&nbsp; ON SCHEDULE EVERY 1 DAY STARTS '2000-01-01 01:00:00'&nbsp; DO BEGIN&nbsp; ---------------------------------------------------&nbsp; -- Process to delete all tables with&nbsp; -- prefix 'temp_', and older than 1 day&nbsp; SET @tbls = (&nbsp; &nbsp; SELECT GROUP_CONCAT(TABLE_NAME)&nbsp; &nbsp; &nbsp; FROM information_schema.TABLES&nbsp; &nbsp; &nbsp; WHERE TABLE_SCHEMA = 'mydb'&nbsp; &nbsp; &nbsp; &nbsp; AND TABLE_NAME LIKE 'temp_%'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; AND CREATE_TIME < NOW() - INTERVAL 1 DAY&nbsp; );&nbsp; SET @delStmt = CONCAT('DROP TABLE ',&nbsp; @tbls);&nbsp; PREPARE stmt FROM @delStmt;&nbsp; EXECUTE stmt;&nbsp; DEALLOCATE PREPARE stmt;&nbsp; ---------------------------------------------------&nbsp; END */$$DELIMITER ;
随时随地看视频慕课网APP

相关分类

Go
我要回答