优化聊天应用数据库

Posted

技术标签:

【中文标题】优化聊天应用数据库【英文标题】:Optimizing chat application database 【发布时间】:2015-07-01 02:09:04 【问题描述】:

我正在开发一个带有数据库的简单聊天应用程序。该项目的数据库如图所示。

消息表中的方向列只是为了判断user1是发送者还是user2是发送者。

我使用这个查询来获取消息:

SELECT  TextContent,Direction FROM Messages
WHERE   User1 = 1 AND User2 = 2 
ORDER BY Date

User1 和 User2 的值仅用于说明。

我有两个问题:

    我没有为 Messages 表选择主键。我应该简单地选择 ID 列作为主键还是选择多个列作为主键?

    我应该在 (User1,User2, 日期)列或(用户1,用户2,ID)列?。我应该创建集群索引还是非集群索引?

【问题讨论】:

How to choose indexes for chat application database的可能重复 @mohan111 这不是重复的。这里的问题更具体。我试图从链接中的问题中得到完整的答案,但我做不到。回答问题的程序员没有回答我的 cmets。 【参考方案1】:

是的,您应该在 ID 列上定义一个主键聚集索引。

是的,您应该在 (User1, User2, Date) 上定义一个非聚集复合索引。如果您将 ID 定义为聚集索引,则 ID 已“包含”在非聚集索引中。

【讨论】:

很好的答案,但为什么 ID 应该是主键? 这很复杂,我可以写一本关于这个主题的书。简单地回答您的问题...将主键作为 ID(我假设您也将其设置为身份)将确保您不会意外分配具有相同 ID 的 2 行。将其定义为聚集索引将确保将新行添加到最后一页的末尾,从而防止页面拆分。 (页面拆分是一个很长的话题,大多数人天真地不知道)... 此外,使用单个整数列(4 字节)作为聚集索引而不是多列的组合将使表上的所有非聚集索引更小更紧凑,因为聚集索引的值得到在后台添加到所有非聚集索引行。 感谢您的重播。

以上是关于优化聊天应用数据库的主要内容,如果未能解决你的问题,请参考以下文章

国产数据库优化该做些什么

用于服务器连接优化的 Android Activity 生命周期

快速为聊天应用创建核心数据

聊天应用程序,如何存储聊天记录?

iOS:使用 CoreData 的聊天应用程序

Firebase 网络应用聊天重复聊天输入