(※本記事はSPEED-CUBE ver1.7について記述しております)
SPPED-CUBEとは?
EC CUBEで商品やカテゴリの件数が多くなった、重くなった、そんな時に出会ったのがこのプラグインでした。
商品一覧を高速化するプラグイン SPEED-CUBE
プラグインを入れるだけで速くなる! すごい!
有効化するのも重い
プラグインをインストールして「有効化」をポチッ……
処理が終わらない……?
EC-CUBEの高速化プラグインでつまずいたこと
インデックスを張る操作に時間がかかって処理が終わんねー\(`Д´)ノ
そもそもデータ量が多くて困ってプラグインを入れようとしているのに、データ量が多いと処理が終わらないとは。
SPEED CUBE用のINDEXを手動で作成する
プラグインをインストール
プラグインを普通にインストールします。有効化はしない。
プラグインでCREATE INDEXを行わないようにする
data/downloads/plugin/WbmSpeedCube/WbmSpeedCube.phpのL151をコメントアウト。
plg_WbmSpeedCube_Util::createIndexes(self::$_indexArray);
EC-CUBEのDBにINDEXを作成する(一部ALTER TABLEする)
CREATE INDEX plg_wbmspeedcube_d878de5a1d715929446251e6ec4f047e ON dtb_category (`parent_category_id`,`category_id`);
CREATE INDEX plg_wbmspeedcube_41d48b62d1b326c157bb43ebb1303900 ON dtb_category (`del_flg`,`rank`);
CREATE INDEX plg_wbmspeedcube_af58ff2160967a9e918aac57c9e22318 ON dtb_product_categories (product_id,rank);
CREATE INDEX plg_wbmspeedcube_eef72c3b525fc73ba229bff80fad5852 ON dtb_product_categories (`category_id`,`product_id`,`rank`);
CREATE INDEX plg_wbmspeedcube_eee278233028bfc51720d80ff07cca6e ON dtb_products (`maker_id`,`status`,`del_flg`);
CREATE INDEX plg_wbmspeedcube_6d5a5b6cf4d101dbad8bd2239b94d905 ON dtb_products (`status`,`del_flg`);
ALTER TABLE dtb_products_class MODIFY COLUMN product_code VARCHAR(255);
CREATE INDEX plg_wbmspeedcube_bfaf53a4613f781b99e1a24412568b15 ON dtb_products_class (`product_id`,`del_flg`,`price02`,`product_code`);
CREATE INDEX plg_wbmspeedcube_1ea985c6feb1ae8e82a4a128f679fcae ON dtb_products_class (`del_flg`,`product_id`,`price02`,`product_code`);
CREATE INDEX plg_wbmspeedcube_1d35ce71961c25dd25e53120fd49858a ON dtb_product_status (`product_status_id`,`del_flg`);
(※INDEX名はプラグインから自動的に作成してもこれになる)
プラグインを有効にする
チェックボックスぽちー
CREATE INDEXをしないようになっているので、有効化処理は一瞬で終わる。
張ったINDEXに対して色々とプラグインのコードがよしなにしてくれているみたいなので、プラグインは有効化しておく。
SPEED-CUBEにはバグがあるぞ~
プラグイン内 plg_WbmSpeedCube_Util.php の450行目あたりには
foreach ($indexes as $tableName => $rows) {
foreach ($rows as $indexName => $row) {
$sql = 'CREATE INDEX ' . $indexName . ' ON ' . $tableName . ' ';
$sql.= implode(',', $row) . ";\n";
}
self::getDbAdapter()->query($sql);
}
というコードがあり、ものの見事に「テーブル1つにつきINDEXを1つしか作成してくれない」動作をしてくれています。
正しくはqueryが直上のforeachスコープの中かなーって。
なので、手動でINDEXを作成しない場合もここは直しておく必要有り。