我有一张表,用于存储用户用户的评论。我将有 1 亿多条评论。
我可以创建它的 2 种方法:
选项 1:用户名和评论 ID 为 PK。这样,所有评论都按用户名和评论 ID 物理存储。
CREATE TABLE [dbo].[Comments](
[user] [varchar](20) NOT NULL,
[com_id] [int] IDENTITY(1,1) NOT NULL,
[com_posted_by] [varchar](20) NOT NULL,
[com_posted_on] [smalldatetime] NOT NULL CONSTRAINT DEFAULT (getdate()),
[com_text] [nvarchar](225) COLLATE NOT NULL,
CONSTRAINT [PK_channel_comments] PRIMARY KEY CLUSTERED
([channel] ASC, [com_id] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]
优点:我的查询将通过comment_id DESC 获取用户订单的所有或前10 条评论。这是寻找
选项 2:我可以将评论 ID 设为 PK。这将存储按评论 ID 排序的评论,而不是用户名。
缺点:获取给定用户的最新前 10 条评论不再是一种搜索,因为数据不是由用户存储的(即不按用户排序)。所以我必须创建其他索引来提高查询性能。
哪种方式是最好的方式?插入和删除呢?这些操作是允许的。但是经常阅读。
用户不能修改他们的评论。
我用 1.1M 行测试了两个表。结果如下:
table_name rows reserved data index_size unused
comments2 1079892 99488 KB 62824 KB 36576 KB 88 KB (PK: com_id Second Index on (user_name, com_id))
comments1 1079892 82376 KB 82040 KB 328 KB 8 KB (PK: user_name, no other indices)
--------------------------------------------------------------------
diff: same rows 17112KB -19216KB 36,248KB 80KB
因此,以 com_id 为 PK 的表使用 36MB 额外磁盘空间仅用于 2 索引 使用 SEEK 在两个表上选择顶部查询,但以 com_id 作为 PK 的表较慢但是当我将 com_id 作为 PK 时插入速度稍快
任何意见?