質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

1回答

572閲覧

WordPressのN+1問題を解決する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

3クリップ

投稿2018/05/20 09:21

既存のWordPressサイトのパフォーマンス向上作業を行っているのですが、今回始めてWordPressに触れたということで、質問があります。

サイト表示速度を上げたいということでまず気になったのが、ページあたりのデータベースクエリ数が非常に大きく、例えば記事を20回表示すると合計40回ほどのクエリが発生していました。

背景としては「記事のレコードを取得▷サムネイル取得時に他テーブルを参照」ということを、レコードの数だけ毎回実行している、典型的なN+1問題が発生しています。

これまで私が多く開発してきた他言語、フレームワークではORマッパーがN+1問題を簡単にクリアしてくれたのですが、WordPressはデフォルトでORマッパーがなく、開発者はN+1問題をどのように解決しているのかで悩んでいます。

自分でSQLを書くというのが最もシンプルな方法ですが、メンテナンス性や可読性では大分ORマッパーに劣るので、極力スマートな方法を模索しているのですが、どうしたら良いでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/20 23:33

そのクエリーが遅いという確証はとりましたか?
guest

回答1

0

クエリー実行数が多いことが、どのように問題なのでしょうか。
質問文の中には、遅いとか重いというようなニュアンスが感じられず、
クエリー実行数で課金されるようなサーバーだから減らしたい、などという、
クリティカルな問題でもなければ、
実行数の多さはさほど問題ではないと思います。

asahina1979さんの指摘のように、
特定のクエリーが遅くて、それがボトルネックになって、
結果としてページが表示されるまで時間がかかって困っているということであれば、
クエリーを洗い出してそれぞれ実行計画を取得して、
原因と思われる事項を改善していく手を打つべきだとおもいますが、
そのような具体的な数字も示されていませんので
第三者的に簡単に言うなら「クエリー実行数が多い? だからなに?」って感じです。

幸いにも、キャッシュを強化するプラグインもあるようですので、
組み合わせてみてはいかがでしょうか。
(ただし相性問題もあるので、これ、というのをこの場ではお勧めしません。)

投稿2018/05/21 00:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/21 05:06 編集

回答ありがとうございます。まずは提示した要件に不足があり申し訳ございません。 クエリ数についてはページによってまちまちですが、レコード数の分だけ関連テーブルを読み込んでしまうという状況ですので、例えば50記事を表示すれば100以上のクエリが発生するということになりますし、いかに一つ一つのクエリが軽いといえども、本来削れるはずのクエリが多数発生すれば、通信ラグやデータベース内部の処理を考えれば、ほとんどの状況で期待値ほどのレスポンス速度は実現できないかと思います。(そして実際に測定していますが、DBクエリがボトルネックになっております) またキャッシュについては仰る通りですが、大本の原因としては関連テーブルを逐次読み込むというN+1問題にありますので、そこを解決するというアプローチ自体が不適切とは感じておりません。(N+1というのはパフォーマンス向上における基本事項と認識しております) 実行計画につきましては、関連テーブルを一度に複数取得するということは質問文にもあげておりますが、他のフレームワークではN+1問題を解決する手法がデフォルトであるのに対し、WordPressではそれをどのように実行するのがベストなのかということが主題となります。
KazuhiroHatano

2018/05/21 05:59

WPを弄るときはフィルタフックでやるのが基本 クエリについてもフィルタフックが各所に用意されてます 大体のクエリ関連の関数でwhere join orderbyのパーツごとに フィルタフックが用意されているので そこでやるのがWPとしては行儀がいいです クエリ文を弄るレベルになるとリファレンスとかみるより もうソースを見た方が手っ取り早いので wp-includes/class-wp-query.phpとかを開いて どこのクエリをいじくれるようになってるか 見てみると良いかと思います
退会済みユーザー

退会済みユーザー

2018/05/21 09:14

なるほど、ありがとうございます。テーブル構造が頭にないと挙動が理解できないSQL文をあまり書きたくないので、分かりやすいクエリを発行できる手法をご指導頂いたことを参考に探してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問