MTのカスタムフィールドを MySQL の Bulk Insertにしたら Data API からの記事投入/更新が300%以上高速化されたというお話し

| コメント(0) | トラックバック(0)

Data APIから1日数千件のエントリを更新、新規追加するというような要件の案件で現場から「スピードがでないんっすよ」ということでヘルプ要請が来たのですが、「CGIの起動がクソ重いんじゃないの?」ということで複数件のJSONを纏めて投げられるエンドポイントを作成して対応しようとしたのですが、それでもまっっっったくと言っていいほどパフォーマンスの改善が見られない。再構築をキューにして凌ごうと思ったのですがそれでも一件 Insert するのに10秒も20秒もかかるのです。

  • Data APIで記事インサート、アップデート
  • 1件10〜20秒を要する

調べたところ、こいつが問題。

  • 記事カスタムフィールドが200個近く!

コードを見たり、SQLのクエリを見たり。犯人見つけましたぜ。

MTのカスタムフィールドは1フィールド1レコードで、1フィールド1SQLを発行するのです

なのです。こんなこと知ってたらカスタムフィールド200個近くも作成しないですよね? 5件単位でインサートだったらSQL1000クエリ、カスタムフィールドのためだけに投げるわけです。

なので、MySQLの Bulk Insertを使うようにしてみたらめっちゃ速くなったよというお話でした。単位は秒。Updateの場合は Insertの倍のスピードになります。SQLの数が半端ないので、1台構成より DBとCMSがわかれている複数台構成の方が効果は顕著です。

カスタムフィールドをBulk Insertにしたら300%以上高速化されたという話し(効果測定結果)

ObjectDriver が DBI::mysql で、mt-config.cgiに「BulkInsertMeta」環境変数を指定しているときのみ有効になります。あくまでも実験的な位置づけなのでノンサポート、自己責任でお願いします。

/mt/lib/MT/Meta/Proxy.pm

Oracle や SQL Serverに対応できていないので、その辺りが課題ですが、いずれにしても MTには足回りの強化をお願いしたいところです(既にお願いはしておいたんですがね)。

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/931

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2016年1月28日 14:49に書いたブログ記事です。

ひとつ前のブログ記事は「ウェブページにフォルダの指定を忘れてトップページを上書きしたことがある、あるいはそういうケースに遭遇したことがある。 #movabletype #mt」です。

次のブログ記事は「複数の ウェブサイト/ブログ を串刺しにした月別アーカイブを作る」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6