2015-11-07 4 views
7

私は、テンポラリテーブルを作成するプロシージャを格納しています。私はその後、これらの一時テーブルと結合するクエリを実行したいと思います。GoでMySQL Temp Tablesを使用する方法はありますか?

問題は、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; 

使用して、それをドロップし、有益な何かをします。あなたは時折放棄された一時テーブルをクリーンアップしたいと思う

、あなたがするのmysqlにスケジュールされたイベントを作成することができます1日より古いmydb.temp_%のテーブルを削除するには、イベントを予定

DROP TABLE temp_32rfd293: 

この。これを行う場合は、偶発的な削除を防ぐために、一時表用の専用スキーマを使用することを検討してください。

注:これが機能するには、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 ; 
関連する問題