2018年2月6日火曜日

EC-CUBE 2系のDB速度問題

今更すぎますが、まだ3系よりも2系の方がメジャーなようなので、2系ネタです。

EC-CUBE2系のDBは、postgresqlとmysqlの2つから選べますが、postgresqlが圧倒的に早いです。
これを勘違いして、mysqlよりpostgresqlが優秀と信じている人が居ます。
EC-CUBE上での実行速度比較をしたりしてね。

EC-CUBE2系でpostgresqlが速いのはあたりまえです。
postgresqlでのみ高速に動くようにチューニングされています。
postgresql専用のクエリを使っています。

mysqlにした場合、簡易的なクエリ変換を行って実行しています。
遅くてあたりまえです。一切のチューニングが行われていません。

致命的なのは、postgresqlはビューを使って高速化しているのに対し、mysqlでは使っていません。
mysqlでもビューを使う事で、同じ速度になります。


そもそも、この程度の物にビューに使わないと重くなるってこと自体がおかしいです。
クエリ内容を見直すことで、数百倍から数万倍以上の高速化が可能です。※実話です。
ほぼすべてのクエリに問題があるので、どことは言えません。言うならば、全ての箇所です。
重いと思ったらクエリを最適化してください。天と地の差が出ます。

・意味のない処理をしていないか。※仕様変更等での消し忘れが意外とある
・インデックスを適切に使っているか。 ※インデックスがまともに無い・・・
・無駄にフルスキャンする状態になってないか

ビューと使うとカスタマイズが面倒な事になるので、避けた方が良いです。

2018年2月5日月曜日

最新版Edgeでpopstateに問題発生

最近Edgeがアップデートされ、popstateの動作が変わりました。
他ブラウザとの互換性が無くなりました。

まぁ、バグでしょう。 バグで直る事をお祈りします。

初回アクセス時に実行させないよう

if(!event.originalEvent.state) return;

は、もはやスニペット入りしていると思います。
しかし、このif文がfalseになることはありません。
nullになりません。
オブジェクトが入ってしまうようになりました。

※もちろん、if文が不要な状況下は話は別ですし、そういう議論ではないので書きません。


pushstateして,formのsubmitによるページリロードが行われた時、popstateが発火します。
このとき、originalEvent.stateがnullとならず、submit前にpushstateで登録してあるオブジェクトが入っているのです。

このため、オブジェクトが現在のページの物であるかの判定を追加する必要がでてきました。
URLが同一かの判定が楽だと思います。