sql-server - 如何为聊天应用数据库选择索引

标签 sql-server database-design indexing chat

我在开发一个带有数据库的小型聊天应用程序。我创建了图中所示的数据库。 Database for chat application

我是索引新手,我想为查询选择合适的索引。

我可以在 Messages 表中使用聚簇索引吗?如果可以的话,哪一列(或多列)应该有聚簇索引?还是应该使用非聚集索引?

更新:我用来获取消息的查询是:

 Select TextContent From Messages where (SenderId='1' and ReciverID = '2') or (SenderId='2' and ReciverID = '1') order by date

SenderID 和 ReciverID 的值只是为了说明。

最佳答案

您可能应该向您的消息表添加一个代理主键并创建一个索引:

ALTER TABLE messages ADD COLUMN id BIGINT NOT NULL IDENTITY

ALTER TABLE messages ADD CONSTRAINT pk_messages_id PRIMARY KEY (id)

CREATE INDEX ix_messages_sender_receiver_date (senderId, receiverId, date) ON messages

如果您只想检索对话链中前 10 条最后的消息,稍微重写您的查询可能会有所帮助:

SELECT  m.*
FROM    (
        SELECT  TOP 10
                *
        FROM    (
                SELECT  date, id
                FROM    messages
                WHERE   senderId = 1 AND receiverId = 2
                UNION
                SELECT  date, id
                FROM    messages
                WHERE   senderId = 2 AND receiverId = 1
                ) q
        ORDER BY
                date DESC, id DESC
        ) q
JOIN    messages m
ON      m.id = q.id

这样,SQL Server 更有可能合并连接对话的两个方向,而不是分别对它们进行排序。

或者,使用 user1 代替发送方和接收方, user2direction ,所以 user1 < user2 (总是)和 direction定义文本是否来自 user1user2反之亦然。

这样,您始终可以简单地根据 user1 = 1 AND user2 = 2 进行过滤,无需担心 OR或工会。

您可以在还可以索引的计算列中执行此操作:

ALTER TABLE messages ADD COLUMN user1 AS CASE WHEN senderId < receiverId THEN senderId ELSE receiverId END

ALTER TABLE messages ADD COLUMN user2 AS CASE WHEN senderId > receiverId THEN senderId ELSE receiverId END

ALTER TABLE messages ADD COLUMN direction AS CASE WHEN senderId < receiverId THEN 0 ELSE 1 END

CREATE INDEX ix_messages_user1_user2_date ON messages (user1, user2, date)

然后选择:

SELECT  *
FROM    messages
WHERE   user1 = 1
        AND user2 = 2 -- make sure lower number goes to user1, higher number goes to user2
ORDER BY
        date

关于sql-server - 如何为聊天应用数据库选择索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149569/

相关文章:

sql-server - SQL Server 中数据库数量的实际限制?

sql-server - 无法仅从远程服务器使用 SQL 身份验证登录

php - 将用户表的架构从旧设计更改为新设计

php - 高级数据库设计 - 执行以下操作的最有效方法是什么

matlab - Mablab/Octave - 使用 cellfun 将一个矩阵与另一个矩阵建立索引

sql-server - 如何计算开始时间和结束时间之间的总分钟数?

sql-server - 如果我想将多个数据库合并为一个数据库,应该注意什么?

php - 如果不需要进行查询,冗余数据是否可以?

mysql - 索引 bool 字段是否有任何性能提升?

mysql - 如何在 MySQL 上创建有效的索引