使用MySql查询来加载最近的聊天消息

时间:2017-06-17 20:07:31

标签: mysql

对于正在构建的聊天应用程序的MySql查询,我遇到了一些性能问题。

我正试图从对话中获取最新消息。我正在测试一个大约有300万行的表(从旧版本的应用程序导出)。从某些对话加载时,它很快。从其他人加载时,查询需要更长的时间。

这里有关于表设置的详细信息,它是一个InnoDB表:

Column      Type                    Comment
id          int(10) unsigned        Auto Increment   
from        int(10) unsigned NULL    
to          int(10) unsigned NULL    
date        int(10) unsigned NULL    
message     text NULL    
read        tinyint(1) NULL [0] 

以下是我的索引:

PRIMARY id
INDEX   from
INDEX   to
INDEX   date

这是我正在运行的当前查询的示例:

SELECT *
FROM `chat`
WHERE 
(`from` =2 and `to` = 342)
OR
(`to` = 2 and `from` = 342)
ORDER BY `id` DESC
LIMIT 10

现在,当我使用此用户组合(数据库中总共只有325行)运行此查询时,需要1.5秒以上。

但是,如果我使用不同的用户组合,在数据库中总共有12,000行,如下所示:

SELECT *
FROM `chat`
WHERE 
(`from` =2 and `to` = 10153)
OR
(`to` = 2 and `from` = 10153)
ORDER BY `id` DESC
LIMIT 10

然后查询在大约35-40毫秒内运行。相当大的差异,与我期望的相反。

我确信我在这里遗漏了一些东西,并希望有任何帮助指出我正确的方向来优化所有这些。

2 个答案:

答案 0 :(得分:0)

不是用户有多少记录。你已经为所有聊天创建了一个表,这是一个问题,当你尝试获取用户的前10条记录时,最近插入的条目将被称为胖子。

答案 1 :(得分:0)

嗯,你可以尝试的另一件事是使用UNION,而不是使用OR,这会带来一些优势。

尝试使用它:

SELECT *
FROM `chat`
WHERE 
(`from` =2 and `to` = 342)
UNION
SELECT *
FROM `chat`
WHERE
(`to` = 2 and `from` = 342)
ORDER BY `id` DESC
LIMIT 10

在您的情况下查询所花费的时间还取决于任何用户发送消息的时间。

为此,您应该更改模型,而不是在一个表中包含所有消息。