2015-11-07 15 views
7

Mam procedur przechowywanych, które tworzą tabele tymczasowe. Chciałbym następnie wykonać kwerendę, która łączy się z tymi tabelami tymczasowymi.Czy istnieje sposób korzystania z tabel tempa MySQL w programie Go?

Problem polega na tym, że w przypadku projektowania bazy danych/sql Golang, jedynym sposobem zapewnienia tego samego połączenia dla kolejnych zapytań jest utworzenie transakcji.

Czy mogę prosić o kłopoty, jeśli zawinę większość moich SELECT w transakcji w celu uzyskania dostępu do tabeli tymczasowej? Rozumiem, że utracę wydajność/skalowalność, ponieważ będę utrzymywał połączenia z puli, zamiast pozwalać im na powrót między zapytaniami. Ale zastanawiam się, czy zacznę widzieć blokowanie lub inne poważne problemy związane z tą strategią.

Powodem, dla którego muszę to zrobić, jest to, że plan wykonania MySQL dla wielu moich tabel jest bardzo słaby (robię kilka sprzężeń między dużymi tabelami). Chciałbym wykonać niektóre zapytania pośrednie i przechowywać ich wyniki w tabelach tymczasowych, aby uniknąć tego problemu.

+0

Nawet w przypadku tabel tymczasowych? Czy nie ma sposobu, aby użyć tabel tymczasowych w Golang? – william

+0

Dokumenty wskazują, że utworzenie tabeli tymczasowej nie spowoduje niejawnego zatwierdzenia (https://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html), ale nie ma możliwości dodania do nich indeksów jak to by było. – william

+0

Tymczasowe tabele w MySQL są widoczne tylko dla bieżącego połączenia. Gdy połączenie się zamknie, zostaną upuszczone. Jeśli korzystasz z tabel tymczasowych, musisz utrzymywać połączenie podczas prowadzenia działalności. – Code4aliving

Odpowiedz

4

Można tworzyć własne tabele pseudo tymczasowe, do których można uzyskać dostęp za pomocą wielu procesów i połączeń.

Chodzi o to, aby po prostu tworzyć tabele pamięci, uruchamiać operacje i czyścić później.

Można utworzyć tabelę pamięci z następującym sql;

CREATE TABLE mydb.temp_32rfd293 (
    id int(11) auto_increment, 
    content varchar(50), 
    PRIMARY KEY (`id`) 
) ENGINE=MEMORY; 

zrobić coś pożytecznego, a następnie upuść ją przy użyciu;

DROP TABLE temp_32rfd293: 

Zaplanowane zdarzenie, aby usunąć mydb.temp_% tabele starsze niż 1 dzień

Będziemy chcieli, aby oczyścić stoliku opuszczony temp, można utworzyć zaplanowane wydarzenie w mysql zrobić to. Jeśli zdecydujesz się to zrobić, rozważ użycie dedykowanego schematu dla tabel tymczasowych, aby zapobiec przypadkowym usunięciom.

Uwaga: w pliku my.ini musisz mieć event_scheduler=ON, aby to działało.

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 ;