优化mysql查询语句

优化mysql查询语句,mysql,optimization,explain,Mysql,Optimization,Explain,我应该如何优化此查询 EXPLAIN EXTENDED SELECT cm . *, u1.Firstname AS u1Firstname, u1.Lastname AS u1Lastname, u2.Firstname AS u2Firstname, u2.Lastname AS u2Lastname, COUNT(*) AS Count FROM ChatMessage AS cm LEFT JOIN Use

我应该如何优化此查询

EXPLAIN EXTENDED SELECT 
    cm . *,
    u1.Firstname AS u1Firstname,
    u1.Lastname AS u1Lastname,
    u2.Firstname AS u2Firstname,
    u2.Lastname AS u2Lastname,
    COUNT(*) AS Count
FROM
    ChatMessage AS cm
        LEFT JOIN
    Users AS u1 ON cm.UserId = u1.UserId
        LEFT JOIN
    Users AS u2 ON cm.FriendId = u2.UserId
WHERE
    (cm.UserId IN (292 , 289)) AND (cm.FriendId IN (292 , 289))
ORDER BY cm.DateAdded DESC;
解释:

1个简单cm所有fk_ChatMessage_用户1,fk_ChatMessage_用户2 238 59.24使用where
1个简单的u1 eq_ref PRIMARY 4 mhware.cm.UserId 1 100.00
1个简单的u2 eq_ref PRIMARY 4 mhware.cm.FriendId 1 100.00

问题是:ChatMessage使用外键,一个在UserId上,一个在FriendId上,指向Users表中的UserId

在解释中,您可以看到它不知道如何正确使用索引。如果我添加了一个新的索引(UserId,FriendId)或/和(FriendId,UserId),它有4种可能,并且不使用其中任何一种

此语句运行约1秒,并转储我的慢速查询日志文件,其中包含大量垃圾


谢谢。

您可以尝试添加两个索引吗。一个在cm.UserID上,另一个在cm.FriendId上?我不太明白你的外键设置,因为你使用的是左连接,所以你是说用户可能不存在?为什么要使用外键?

尝试使用以下查询在(UserId,FriendId)上添加新索引:

SELECT 
    cm . *,
    u1.Firstname AS u1Firstname,
    u1.Lastname AS u1Lastname,
    u2.Firstname AS u2Firstname,
    u2.Lastname AS u2Lastname,
    COUNT(*) AS Count
FROM (select 289 u, 289 f union all 
      select 289, 292 union all 
      select 292, 289 union all 
      select 292, 292) uf
JOIN ChatMessage AS cm ON uf.u = cm.UserId and uf.f = cm.FriendId
LEFT JOIN Users AS u1 ON cm.UserId = u1.UserId
LEFT JOIN Users AS u2 ON cm.FriendId = u2.UserId
ORDER BY cm.DateAdded DESC;