对于正在构建的聊天应用程序的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毫秒内运行。相当大的差异,与我期望的相反。
我确信我在这里遗漏了一些东西,并希望有任何帮助指出我正确的方向来优化所有这些。
答案 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
在您的情况下查询所花费的时间还取决于任何用户发送消息的时间。
为此,您应该更改模型,而不是在一个表中包含所有消息。