52
WordPress DB & Performance 2014/08/30 Takayuki Miyauchi 初心者向け

初心者向けWordPress DB & Performance

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 初心者向けWordPress DB & Performance

WordPress DB & Performance

2014/08/30 Takayuki Miyauchi

初心者向け

Page 2: 初心者向けWordPress DB & Performance

自己紹介

Page 3: 初心者向けWordPress DB & Performance

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

Page 4: 初心者向けWordPress DB & Performance
Page 5: 初心者向けWordPress DB & Performance
Page 6: 初心者向けWordPress DB & Performance
Page 7: 初心者向けWordPress DB & Performance

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

Page 8: 初心者向けWordPress DB & Performance

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

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

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

Page 9: 初心者向けWordPress DB & Performance
Page 10: 初心者向けWordPress DB & Performance
Page 11: 初心者向けWordPress DB & Performance

今日のお話

Page 12: 初心者向けWordPress DB & Performance

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

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

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

• 質問タイム

Page 13: 初心者向けWordPress DB & Performance

インデックス講座

Page 14: 初心者向けWordPress DB & Performance

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

Page 15: 初心者向けWordPress DB & Performance

インデックスって?

• 索引のこと。

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

Page 16: 初心者向けWordPress DB & Performance

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

Page 17: 初心者向けWordPress DB & Performance

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

Page 18: 初心者向けWordPress DB & Performance

巻末の索引を見て探す。

Page 19: 初心者向けWordPress DB & Performance

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

Page 20: 初心者向けWordPress DB & Performance

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

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

超重要!

Page 21: 初心者向けWordPress DB & Performance

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

Page 22: 初心者向けWordPress DB & Performance

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

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

超重要!

Page 23: 初心者向けWordPress DB & Performance

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

EXPLAIN SELECT * FROM wp_posts WHERE …

Page 24: 初心者向けWordPress DB & Performance

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

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

Page 25: 初心者向けWordPress DB & Performance

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

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

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

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

Page 26: 初心者向けWordPress DB & Performance

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

Page 27: 初心者向けWordPress DB & Performance

でも負荷はまるで違う

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

Page 28: 初心者向けWordPress DB & Performance

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

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

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

Page 29: 初心者向けWordPress DB & Performance

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

Page 30: 初心者向けWordPress DB & Performance

WordPressで重くなりがちな処理

Page 31: 初心者向けWordPress DB & Performance

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

(例)

Page 32: 初心者向けWordPress DB & Performance

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

meta_key meta_value

Page 33: 初心者向けWordPress DB & Performance

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

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

Page 34: 初心者向けWordPress DB & Performance

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

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

Page 35: 初心者向けWordPress DB & Performance

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

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

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

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

Page 36: 初心者向けWordPress DB & Performance

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

Page 37: 初心者向けWordPress DB & Performance

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

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

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

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

Page 38: 初心者向けWordPress DB & Performance

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

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

Page 39: 初心者向けWordPress DB & Performance

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

Page 40: 初心者向けWordPress DB & Performance

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

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

Page 41: 初心者向けWordPress DB & Performance

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

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

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

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

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

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

Page 42: 初心者向けWordPress DB & Performance

遅いSQLの見つけ方

Page 43: 初心者向けWordPress DB & Performance

Debug Bar

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

開発者が豪華!

Page 44: 初心者向けWordPress DB & Performance

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

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

Page 45: 初心者向けWordPress DB & Performance

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

Page 46: 初心者向けWordPress DB & Performance

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

Page 47: 初心者向けWordPress DB & Performance

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

Page 48: 初心者向けWordPress DB & Performance

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

Page 49: 初心者向けWordPress DB & Performance

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

Page 50: 初心者向けWordPress DB & Performance

最後に宣伝

Page 51: 初心者向けWordPress DB & Performance

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

Page 52: 初心者向けWordPress DB & Performance

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