私は、MySQLバージョン5.0.95でDrupal 6を使用しています。最近の記事の日付に基づいてコンテンツを表示するクエリが遅くなり、使用頻度によってサイトのパフォーマンスが完全に失われます。ORDER BY句を使用するMySQLクエリを最適化できません
SELECT n.nid,
n.title,
ma.field_article_date_format_value,
ma.field_article_summary_value
FROM node n
INNER JOIN content_type_article ma ON n.nid=ma.nid
INNER JOIN term_node tn ON n.nid=tn.nid
WHERE tn.tid= 153
AND n.status=1
ORDER BY ma.field_article_date_format_value DESC
LIMIT 0, 11;
は、クエリのEXPLAIN以下の結果を示しています:問題のクエリは以下の通りです。このクエリはまっすぐ前方に比較的単純なように見えたと
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
| 1 | SIMPLE | tn | ref | PRIMARY,nid | PRIMARY | 4 | const | 19006 | Using temporary; Using filesort |
| 1 | SIMPLE | ma | ref | nid,ix_article_date | nid | 4 | drupal_mm_stg.tn.nid | 1 | |
| 1 | SIMPLE | n | eq_ref | PRIMARY,node_status_type | PRIMARY | 4 | drupal_mm_stg.ma.nid | 1 | Using where |
+----+-------------+-------+--------+--------------------------+---------+---------+----------------------+-------+---------------------------------+
およびカテゴリに属する記事を検索します(用語)153であり、ステータス1(発行済み)である。しかし、明らかにテンポラリテーブルを使用してfilesortを使用すると、クエリは私がそれについてブラウズしたことから失敗することになります。
ORDER BY句からfield_article_date_format_valueを削除すると、Using temporaryが解決されます。 filesortを使用するとクエリの実行時間が短縮されますが、これは必須であり、トレードオフすることはできませんが、残念なことにサイトのパフォーマンスは同じです。
私の勘違いは、記事をカテゴリにマップするterm_nodeテーブルから来ており、記事Xが5つのカテゴリC1 ... C5に関連付けられている場合は多対多の関係テーブルですそのテーブルでは、このテーブルはすぐに使えるdrupalからのものです。重いDBのコンテンツへの対処
は私に何か新しいものと類似したクエリの一部を通過( When ordering by date desc, "Using temporary" slows down query、 MySQL performance optimization: order by datetime field)である私が一緒にORDER BY句でのdatetimeフィールドに使用されcontent_type_articleのための複合インデックスを作成しようとしましたそれに別のキー(nid)を入れてFORCE INDEXを試みました。
SELECT n.nid, n.title,
ma.field_article_date_format_value,
ma.field_article_summary_value
FROM node n
INNER JOIN content_type_article ma FORCE INDEX (ix_article_date) ON n.nid=ma.nid
INNER JOIN term_node tn ON n.nid=tn.nid
WHERE tn.tid= 153
AND n.status=1
ORDER BY ma.field_article_date_format_value DESC
LIMIT 0, 11;
結果とクエリをEXPLAIN以下はフィールドn.nid
+----+-------------+-------+--------+--------------------------+-----------------+---------+----------------------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------------+-----------------+---------+----------------------+-------+---------------------------------+
| 1 | SIMPLE | tn | ref | PRIMARY,nid | PRIMARY | 4 | const | 18748 | Using temporary; Using filesort |
| 1 | SIMPLE | ma | ref | ix_article_date | ix_article_date | 4 | drupal_mm_stg.tn.nid | 1 | |
| 1 | SIMPLE | n | eq_ref | PRIMARY,node_status_type | PRIMARY | 4 | drupal_mm_stg.ma.nid | 1 | Using where |
+----+-------------+-------+--------+--------------------------+-----------------+---------+----------------------+-------+---------------------------------+
多くを助けていないようでした、ca.nid、ma.field_article_date_format_valueはすべてインデックス化されています。 Limit 0,11でDBをクエリすると、ORDER BY句で約7〜10秒かかりますが、クエリを実行するとわずかに時間がかかります。データベースエンジンはMyISAMです。これに関する助けがあれば大いに感謝します。
このクエリを通常のクエリ(クエリと同じ速度で、日付順に並べ替える)にするのに役立つ回答は素晴らしいでしょう。 nid
とfield_article_date_format_value
の組み合わせとして複合クエリを作成してクエリで使用しようとしたが、その原因には役立たなかった。私は問題と新しい提案に関する追加情報を提供することに門を開いています。
応答のおかげで、term_nodeはN:Nですが、特定の用語に対する結果のノードは私の場合では区別されます。以前は派生テーブルのアプローチを試しましたが、クエリの実行は従来の手段とほとんど同じでした。 – optimusprime619