2015-11-07 2 views
7

У меня есть хранимые процедуры, которые создают временные таблицы. Я хотел бы затем выполнить запрос, который соединяется с этими временными таблицами.Есть ли способ использовать MySQL Temp Tables в Go?

Проблема заключается в том, что с базой данных/sql-дизайном Golang, единственный способ гарантировать, что вы получите одно и то же соединение для последующих запросов, - это создать транзакцию.

Я прошу о проблемах, если я завершу большинство своих SELECT в транзакции с целью доступа к таблице temp? Я понимаю, что потеряю некоторую производительность/масштабируемость, потому что я буду держаться за соединения из пула, а не позволять им возвращаться между запросами. Но мне интересно, начну ли я смотреть на блокировку или другие серьезные проблемы с этой стратегией.

Причина, по которой мне нужно сделать это, заключается в том, что план выполнения MySQL для многих моих таблиц очень низок (я делаю несколько объединений в больших таблицах). Я хотел бы выполнить некоторые промежуточные запросы и сохранить их результаты в временных таблицах, чтобы избежать этой проблемы.

+0

Даже для временных таблиц? Нет ли способа использовать временные таблицы в Голанге? – william

+0

Документы показывают, что создание таблицы temp не будет выполнять неявное коммитирование (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, чтобы сделать это. Если вы решите это сделать, подумайте об использовании выделенной схемы для временных таблиц, чтобы предотвратить случайную абсорбцию.

Примечание: вам необходимо 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 ; 
Смежные вопросы