初心者向けwordpress db & performance

Post on 28-May-2015

1.284 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

2014/08/30 に開催されたWordFes Nagoyaで使用したスライドです。

TRANSCRIPT

WordPress DB & Performance

2014/08/30 Takayuki Miyauchi

初心者向け

自己紹介

• フリーランス • デジタルキューブの「め組」メンバー • WordPressとかAWSとか、最近はオープンデータのコミュニティにも出没

デジタルキューブについて

• Amazon Web Service(AWS)コンサルティングパートナー

• オープンソース大好き(WordPress、Nginx、CKAN …)

• ほとんどのスタッフがリモートワーク(神戸、東京、新潟、福岡、仙台、和歌山 …)

今日のお話

• 初心者向けデータベースインデックス講座

• WordPressで重くなりがちな処理

• WordPressで重くなりがちなプラグインのパターン

• 質問タイム

インデックス講座

インデックスを使いこなすと 早くなるらしいぞ!

インデックスって?

• 索引のこと。

• 本で例えるとわかりやすいです。

偶然にも手元に本があるのでこれで説明!

この本の中からwp_headという単語があるページを探すには2通りの方法があります。

巻末の索引を見て探す。

1ページずつ読んで探す。

• 索引を使ったほうが圧倒的に早い。

• 索引を使えば、ページ数が増えても検索に必要な時間はほぼ同じ。

超重要!

DBに置き換えると こうなります。

• インデックスを使ったほうが圧倒的に早い。

• インデックスを使えば、レコード数が増えても検索に必要な時間はほぼ同じ。

超重要!

このあたりの挙動はSQLのEXPLAINで確認できます。

EXPLAIN SELECT * FROM wp_posts WHERE …

テスト用のテーブルに 約3万2千件のレコードを放り込みました。

CREATE TABLE item ( id INT PRIMARY KEY AUTO_INCREMENT, name1 VARCHAR(100), —— indexあり name2 VARCHAR(100), —— indexなし index(name1) );

• select * from item where name1 = ‘item-1’;

• select * from item where name2 = ‘item-1’;

以下のSQLは2つとも同じ結果が得られます。

ただし `name1` はインデックスあり、 `name2` はインデックスなしです。

mysql> select id from item where name1 = 'item-1'; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)

でも負荷はまるで違う

EXPLAINの結果表示される表の `rows` は、 データを取得するために参照したレコードの数。

インデックスを使用しない場合、 必要な行がたったの1行でも、

データベースはすべてのレコードセットを参照します!

レコードが増えるほど重くなる!

そんなわけでインデックスは超大事

WordPressで重くなりがちな処理

インデックスが効いてないクエリー

(例)

みんな大好きカスタムフィールド!

meta_key meta_value

meta_valueにはインデックスが設定されていないので、meta_valueを使った検索は重い。

$args = array( 'post_type' => 'product', 'meta_query' => array( array( 'key' => 'featured', 'value' => 'yes', ) ) ); $postslist = get_posts( $args );

同じ理由でmeta_valueを使った 並べ替えも重い!

$args = array( 'post_type' => 'product', 'orderby' => 'meta_value', 'meta_key' => ‘age', ); $postslist = get_posts( $args );

その他にも• 頻繁に書込するのは重くなる。

• 大きなデータを保存すると重くなる。

• Transient APIは使い過ぎに注意。

• いろいろなテーマやプラグインのインストールとアンインストールを繰り返すと、Optionsが肥大化して重くなる。

重くなりがちなプラグインのパターン

たとえば人気ランキング系 プラグイン

• 人気ランキングを生成するにはページにアクセスがあるたびに、それをデータベースに保存する必要があるはず。

• 月別、週別など、柔軟にランキングを生成するには、サイトにアクセスがあるたびにページの情報と日付をデータベースに保存しているはず。

• 1日1,000PVあるサイトなら毎日1,000行のレコードがデータベースに追加されることになる。。。

http://wordpress.org/plugins/simple-ga-ranking/作者: @horike37さん

このプラグインはGoogle Analytics APIを使ってるので安心!

言わずと知れたJetpackにも 人気ランキング機能があります。

その他にも• Eコマース系のプラグインなどは、meta_valueによる検索を多用してる場合があるので、それらのプラグインを使う場合は要注意。

• 他にもいろいろあるはず。

プラグインを使う場合には、 想像力が大事!

これってDBに頻繁に書き込みするのかな?

大きなデータを保存してないかな?

このファイルはどこに保存されるの?

どのテーブルに保存するのかな?

どんなSQLを実行してるの?

遅いSQLの見つけ方

Debug Bar

https://wordpress.org/plugins/debug-bar/

開発者が豪華!

define( 'WP_DEBUG', true ); define( 'SAVEQUERIES', true );

Debug Barを使うときは以下の設定を追加

SQLの履歴が簡単に確認できます!

http://knowledge.sakura.ad.jp/tech/283/

そうは言ってもどうしても 使いたい時がある!

キャッシュ系プラグインではもっとも簡単で高速&安心

DBにPerconaを使用 リバースプロキシを有効化すればさらに高速

最後に宣伝

「WordPressプラグイン開発のバイブル」 日本ではじめての開発者にフォーカスした書籍です。

ありがとうございました!

top related