亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法在 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 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號