| 1 | = EC-CUBEを手っ取り早く高速化する = |
| 2 | |
| 3 | EC-CUBEが遅い。むちゃくちゃ遅い。死ぬほど遅い。 |
| 4 | 事実、重くて重くてお客様が注文できないことさえ有った。 |
| 5 | 有った、って過去形なのは、高速化できちゃったから。 |
| 6 | |
| 7 | なんと、EC-CUBEをインストールしただけでは、バックエンドのデータベース(MySQL)にインデックスを付加してないのです。 |
| 8 | そのくせ、テーブルは数百から数千レコード有るうえ、複雑な検索問い合わせを多用しています。 |
| 9 | インデックスが無いと、逐次検索を行います。 |
| 10 | nレコード有るテーブルと、mレコード有るテーブルとから検索すると、n×m回の逐次検索を行うのです。 |
| 11 | おかげで、1億回の逐次検索で数時間CPUを占有とか、ばかな状況になっていました。 |
| 12 | なんで、こんなことになってるんでしょうね? |
| 13 | 問題に気づいたら手でインデックスを付けろってことなのでしょうか。 |
| 14 | 要するに一種のバグじゃないかなと思います。 |
| 15 | |
| 16 | それで、しつこくインデックスを付けてやったら速くなりました。とても速くなりました。 |
| 17 | |
| 18 | {{{ |
| 19 | mysql> alter table dtb_session add index (sess_id(32)); |
| 20 | mysql> alter table dtb_products add index (name(10)); |
| 21 | mysql> alter table dtb_order add index (customer_id); |
| 22 | mysql> alter table dtb_customer add index (customer_id); |
| 23 | mysql> alter table dtb_order_detail add index (product_id); |
| 24 | mysql> alter table dtb_order_detail add index (order_id); |
| 25 | mysql> alter table mtb_zip add index (zipcode(7)); |
| 26 | }}} |
| 27 | |
| 28 | 他にもいろいろ付けたと思いますが、忘れました。 |
| 29 | |
| 30 | データベースの専門家的には、インデックスを付けない方が速い場合もあるのでしょうけれど、ま、おおむね、付けて困ることはありません。 |
| 31 | |
| 32 | ''(2009/9/5 - sgk)'' |