2015-11-07 72 views
7

我有存儲創建臨時表的過程。然後我想執行一個連接這些臨時表的查詢。有什麼方法可以在Go中使用MySQL臨時表?

問題是,使用Golang的數據庫/ sql設計,確保爲後續查詢獲得相同連接的唯一方法是創建一個事務。

如果我爲了訪問臨時表的目的而將大部分SELECT選項包裝在事務中,我是否會遇到麻煩?我知道我會失去一些性能/可伸縮性,因爲我將堅持從池中的連接,而不是讓他們回到查詢之間。但我想知道我是否會開始看到這種策略的鎖定或其他嚴重問題。

我需要這樣做的原因是因爲我的許多表的MySQL執行計劃非常差(我在大表中進行了多次連接)。我想執行一些中間查詢並將其結果存儲在臨時表中以避免此問題。

+0

即使是臨時表嗎?那麼Golang中沒有辦法使用臨時表? – william

+0

該文檔指出創建臨時表不會執行隱式提交(https://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html),但是無法向其添加索引因爲它會。 – william

+0

MySQL中的臨時表只對當前連接可見。一旦連接關閉,它們將被丟棄。如果您使用的是臨時表格,則在您開展業務時,您必須堅持這一關係。 – Code4aliving

回答

4

您可以創建自己的僞臨時表,可以通過多個進程和連接來訪問它們。

這個想法是簡單地創建內存表,運行你的操作,然後清理。

您可以使用以下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 ; 
相關問題