我有创建临时表的存储过程。我想再执行一个与这些临时表连接的查询。
问题在于使用Golang的数据库/ sql设计,确保为后续查询获得相同连接的唯一方法是创建事务。
如果为了访问临时表而将大部分SELECT包装在事务中,我是否会遇到麻烦?我知道我将失去一些性能/可伸缩性,因为我将保留池中的连接,而不是允许它们在查询之间返回。但是我想知道我是否会开始看到此策略的锁定或其他严重问题。
我需要这样做的原因是因为我的许多表的MySQL执行计划非常差(我在大型表中进行多次连接)。我想执行一些中间查询并将结果存储在临时表中以避免此问题。
答案 0 :(得分:5)
您可以创建自己的伪临时表,可以由多个进程和连接访问。
我们的想法是简单地创建内存表,运行您的操作,然后进行清理。
您可以使用以下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 ;