Upload
takayuki-miyauchi
View
1.283
Download
4
Embed Size (px)
DESCRIPTION
2014/08/30 に開催されたWordFes Nagoyaで使用したスライドです。
Citation preview
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プラグイン開発のバイブル」 日本ではじめての開発者にフォーカスした書籍です。
ありがとうございました!