Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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あり ...
以下のSQLは2つとも同じ結果が得られます。 
• select * from item where name1 = ‘item-1’; 
• select * from item where name2 = ‘item-1’; 
ただし `n...
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( 
a...
同じ理由でmeta_valueを使った 
並べ替えも重い! 
$args = array( 
'post_type' => 'product', 
'orderby' => 'meta_value', 
'meta_key' => ‘age',...
その他にも 
• 頻繁に書込するのは重くなる。 
• 大きなデータを保存すると重くなる。 
• Transient APIは使い過ぎに注意。 
• いろいろなテーマやプラグインのインストールとアンイン 
ストールを繰り返すと、Optionsが肥...
重くなりがちな 
プラグインのパターン
たとえば人気ランキング系 
プラグイン 
• 人気ランキングを生成するにはページにアクセスがあるた 
びに、それをデータベースに保存する必要があるはず。 
• 月別、週別など、柔軟にランキングを生成するには、サイ 
トにアクセスがあるたびにペー...
このプラグインは 
Google Analytics APIを使ってるので安心! 
http://wordpress.org/plugins/simple-ga-ranking/ 
作者: @horike37さん
言わずと知れたJetpackにも 
人気ランキング機能があります。
その他にも 
• Eコマース系のプラグインなどは、meta_valueによる検索 
を多用してる場合があるので、それらのプラグインを使う 
場合は要注意。 
• 他にもいろいろあるはず。
プラグインを使う場合には、 
想像力が大事! 
これってDBに頻繁に 
書き込みするのかな? 
大きなデータを 
保存してないかな? 
このファイルは 
どこに保存されるの? 
どのテーブルに 
保存するのかな? 
どんなSQLを 
実行してる...
遅いSQLの見つけ方
Debug Bar 
https://wordpress.org/plugins/debug-bar/ 
開発者が豪華!
Debug Barを使うときは以下の設定を追加 
define( 'WP_DEBUG', true ); 
define( 'SAVEQUERIES', true );
SQLの履歴が簡単に確認できます!
http://knowledge.sakura.ad.jp/tech/283/
そうは言ってもどうしても 
使いたい時がある!
キャッシュ系プラグインではもっとも簡単で高速&安心
DBにPerconaを使用 
リバースプロキシを有効化すればさらに高速
最後に宣伝
「WordPressプラグイン開発のバイブル」 
日本ではじめての開発者に 
フォーカスした書籍です。
ありがとうございました!
初心者向けWordPress DB & Performance
初心者向けWordPress DB & Performance
初心者向けWordPress DB & Performance
初心者向けWordPress DB & Performance
初心者向けWordPress DB & Performance
Upcoming SlideShare
Loading in …5
×

初心者向けWordPress DB & Performance

2,204 views

Published on

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

Published in: Technology

初心者向けWordPress DB & Performance

  1. 1. WordPress DB & Performance 2014/08/30 Takayuki Miyauchi 初心者向け
  2. 2. 自己紹介
  3. 3. • フリーランス • デジタルキューブの「め組」メンバー • WordPressとかAWSとか、最近はオープンデー タのコミュニティにも出没
  4. 4. デジタルキューブについて
  5. 5. • Amazon Web Service(AWS) コンサルティングパートナー • オープンソース大好き (WordPress、Nginx、CKAN …) • ほとんどのスタッフがリモートワーク (神戸、東京、新潟、福岡、仙台、和歌山 …)
  6. 6. 今日のお話
  7. 7. • 初心者向けデータベースインデックス講座 • WordPressで重くなりがちな処理 • WordPressで重くなりがちなプラグインのパターン • 質問タイム
  8. 8. インデックス講座
  9. 9. インデックスを使いこなすと 早くなるらしいぞ!
  10. 10. インデックスって? • 索引のこと。 • 本で例えるとわかりやすいです。
  11. 11. 偶然にも手元に本があるのでこれで説明!
  12. 12. この本の中からwp_headという単語がある ページを探すには2通りの方法があります。
  13. 13. 巻末の索引を見て探す。
  14. 14. 1ページずつ読んで探す。
  15. 15. • 索引を使ったほうが圧倒的に早い。 • 索引を使えば、ページ数が増えても検索に必要 な時間はほぼ同じ。 超重要!
  16. 16. DBに置き換えると こうなります。
  17. 17. • インデックスを使ったほうが圧倒的に早い。 • インデックスを使えば、レコード数が増えても 検索に必要な時間はほぼ同じ。 超重要!
  18. 18. このあたりの挙動はSQLの EXPLAINで確認できます。 EXPLAIN SELECT * FROM wp_posts WHERE …
  19. 19. テスト用のテーブルに 約3万2千件のレコードを放り込みました。 CREATE TABLE item ( id INT PRIMARY KEY AUTO_INCREMENT, name1 VARCHAR(100), —— indexあり name2 VARCHAR(100), —— indexなし index(name1) );
  20. 20. 以下のSQLは2つとも同じ結果が得られます。 • select * from item where name1 = ‘item-1’; • select * from item where name2 = ‘item-1’; ただし `name1` はインデックスあり、 `name2` はインデックスなしです。
  21. 21. mysql> select id from item where name1 = 'item-1'; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
  22. 22. でも負荷はまるで違う EXPLAINの結果表示される表の `rows` は、 データを取得するために参照したレコードの数。
  23. 23. インデックスを使用しない場合、 必要な行がたったの1行でも、 データベースはすべてのレコードセットを参照します! レコードが増えるほど重くなる!
  24. 24. そんなわけで インデックスは超大事
  25. 25. WordPressで 重くなりがちな処理
  26. 26. インデックスが 効いてないクエリー (例)
  27. 27. みんな大好き カスタムフィールド! meta_key meta_value
  28. 28. meta_valueにはインデックスが設定されてい ないので、meta_valueを使った検索は重い。 $args = array( 'post_type' => 'product', 'meta_query' => array( array( 'key' => 'featured', 'value' => 'yes', ) ) ); $postslist = get_posts( $args );
  29. 29. 同じ理由でmeta_valueを使った 並べ替えも重い! $args = array( 'post_type' => 'product', 'orderby' => 'meta_value', 'meta_key' => ‘age', ); $postslist = get_posts( $args );
  30. 30. その他にも • 頻繁に書込するのは重くなる。 • 大きなデータを保存すると重くなる。 • Transient APIは使い過ぎに注意。 • いろいろなテーマやプラグインのインストールとアンイン ストールを繰り返すと、Optionsが肥大化して重くなる。
  31. 31. 重くなりがちな プラグインのパターン
  32. 32. たとえば人気ランキング系 プラグイン • 人気ランキングを生成するにはページにアクセスがあるた びに、それをデータベースに保存する必要があるはず。 • 月別、週別など、柔軟にランキングを生成するには、サイ トにアクセスがあるたびにページの情報と日付をデータベー スに保存しているはず。 • 1日1,000PVあるサイトなら毎日1,000行のレコードがデー タベースに追加されることになる。。。
  33. 33. このプラグインは Google Analytics APIを使ってるので安心! http://wordpress.org/plugins/simple-ga-ranking/ 作者: @horike37さん
  34. 34. 言わずと知れたJetpackにも 人気ランキング機能があります。
  35. 35. その他にも • Eコマース系のプラグインなどは、meta_valueによる検索 を多用してる場合があるので、それらのプラグインを使う 場合は要注意。 • 他にもいろいろあるはず。
  36. 36. プラグインを使う場合には、 想像力が大事! これってDBに頻繁に 書き込みするのかな? 大きなデータを 保存してないかな? このファイルは どこに保存されるの? どのテーブルに 保存するのかな? どんなSQLを 実行してるの?
  37. 37. 遅いSQLの見つけ方
  38. 38. Debug Bar https://wordpress.org/plugins/debug-bar/ 開発者が豪華!
  39. 39. Debug Barを使うときは以下の設定を追加 define( 'WP_DEBUG', true ); define( 'SAVEQUERIES', true );
  40. 40. SQLの履歴が簡単に確認できます!
  41. 41. http://knowledge.sakura.ad.jp/tech/283/
  42. 42. そうは言ってもどうしても 使いたい時がある!
  43. 43. キャッシュ系プラグインではもっとも簡単で高速&安心
  44. 44. DBにPerconaを使用 リバースプロキシを有効化すればさらに高速
  45. 45. 最後に宣伝
  46. 46. 「WordPressプラグイン開発のバイブル」 日本ではじめての開発者に フォーカスした書籍です。
  47. 47. ありがとうございました!

×