MTのカスタムフィールドを MySQL の Bulk Insertにしたら Data API からの記事投入/更新が300%以上高速化されたというお話し
公開日 : 2016-01-28 14:49:53
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がわかれている複数台構成の方が効果は顕著です。
ObjectDriver が DBI::mysql で、mt-config.cgiに「BulkInsertMeta」環境変数を指定しているときのみ有効になります。あくまでも実験的な位置づけなのでノンサポート、自己責任でお願いします。
/mt/lib/MT/Meta/Proxy.pm
Oracle や SQL Serverに対応できていないので、その辺りが課題ですが、いずれにしても MTには足回りの強化をお願いしたいところです(既にお願いはしておいたんですがね)。