MySQLの取込で更新と追加の多いテーブルの取込どうやってますか?

MySQLでデータ件数が多く、更新も追加も多いテーブルがあります。

現在500万件くらいですが、日に数万件ずつ増えていっています。

 

Domoで取込する時には「置き換え」か「追加」が選択できるので置き換えにしているのですが

導入当初から比べると件数多くなっているので取込時間が徐々に増えていっています。

 

そこで

今まで置き換えで取り込んでいたdataset-Aとは別に

更新時刻が直近のものだけ取り込んだdataset-Bを新たに作成し

DataFlowのSQLで

Aの中でBに無いもの+Bという形でunionして新たにdataset-Cを作る設定を入れて

出来たことはできたのですが、DataFlowの実行時間が、もともとの置き換えよりかかってしまいました。。

Redshift版でも試したのですが、効果が出るほどの件数ではないのか、あまり変わらず。。

 

指定した項目(テーブル上のPKに該当するもの)が既に存在する場合は更新、無ければ追加

というような取込モードがあればいいなとは思っているのですが、無さそうなので、

もし同じ様なデータを扱っていて取込時間の短縮で工夫されている方がいれば

アドバイスをいただきたく記載させていただきました。

Best Answer

  • honda
    honda 🟢
    Accepted Answer

    こんにちは。

    MySQLのデータフローを利用しています。

    データフロー変換の中で、「出力表を生成」のチェックを外せばDML文を書くことができます。

     

    下記二点を実施することで大分楽になるのではないかと思います。

    1.UPSERTで処理する

    2.INDEXを貼る

     

    以下、自分が利用しているUPSERTの例です。必要であれば参考にしてください。

    - - - - - - - - 

    ■変換①

    -- insert or update のためにkeyを貼っておく。
    ALTER TABLE UPSERT_更新前 ADD PRIMARY KEY (`日付`,`時刻`);

    ■変換②

    -- 日付、時刻、を KEY として、存在していない場合は INSERT
    -- 存在している場合は内容を UPDATE

    INSERT INTO UPSERT_更新前
    (
    `日付`,`時刻`,`テキスト`
    )
    SELECT
    `日付`,`時刻`,`テキスト`
    FROM UPSERT_更新分
    ON DUPLICATE KEY UPDATE
    UPSERT_更新前.`テキスト`= UPSERT_更新分.`テキスト`

     

Answers

  • 元ネタのテーブルの設計は、社内事情的に変えられないのでDomo上でどうにか出来たらなと思っています。

  • @honda 様

     

    「変換」の方で出来たのですね。

    「出力DataSet」の方で削ったりunionするSQLを書いていて

    「凄い時間かかりそうなクエリでindexがdomo上あるのかなぁ」

    とも思っていたので

    ALTERでindexを貼れたり、upsertが出来るのは目から鱗でした。ありがとうございます!

     

     

     

     

     

  • はい、参考になったようでよかったです!

    ぜひご利用ください〜。