私は3つのテーブルmessages
,message_recipients
およびusers
でクエリを実行しています。 messages
テーブルのSQLクエリのパフォーマンスを向上させる
表構造:このテーブルの
id int pk
message_id int
message text
user_id int
...
指数はuser_id
、message_id
とid
です。 message_recipients
テーブルの
表構造:
id int pk
message_id int
read_date datetime
user_id int
...
インデックスid
、message_id
とuser_id
です。 users
テーブルの
表構造:
id int pk
display_name varchar
...
指数はid
です。
私は、これらのテーブルに対して、次のクエリ実行しています:
SELECT
m.*,
if(m.user_id = 0, 'Campus Manager', u.display_name) AS name,
mr.read_date,
IF(m1.message_id > 0 and m1.user_id=1, true, false) as replied
FROM
messages m
JOIN
message_recipients mr
ON
mr.message_id = m.id
LEFT JOIN
users u
ON
u.UID = m.user_id
LEFT JOIN
messages m1
ON
m1.message_id = m.id
WHERE
mr.user_id = 1
AND
m.published = 1
GROUP BY
mr.message_id
ORDER BY
m.created DESC
EXPLAIN
をこのクエリに対して次のデータを返します:@ e4c5によって示唆されるように
UPDATE 、私は新しい複合を追加しました(公開された、user_id、作成された)インデックスであり、今、説明クエリはこれを示します:
多くの時間がかかるので、必要なインデックス(あれば)を追加してこのクエリを最適化するにはどうすればよいですか?
グループ化が必要です重複を避けるために。それは返されたメッセージの 'id'が' message_id'に行く階層的なテーブルです。いいえ、3つの個別のインデックスがあります。いいえ、問題は単一の問題だけでなくすべてのユーザーにあります。はい、 'm1.message_id'は' null'でもかまいません。これは、メッセージがまだ返信されていないことを意味します。メッセージスレッドのようなものはなく、特定のメッセージへの返信として送られたメッセージの 'id'だけです。 – Ehs4n