gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:14:52 30 4
gpt4 key购买 nike

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

问题在于,使用 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:

删除 mydb.temp_% 表超过 1 天的预定事件

你会想要清理偶尔被遗弃的临时表,你可以在 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 ;

关于mysql - 有没有办法在 Go 中使用 MySQL 临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578271/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com