4

我收集人们如何用表格中的类别标记主题,例如:

ID | topic_id | votes_Category_1 | votes_Category_2 |.......... | votes_Category_12

出于历史原因,我每小时都会转储这张桌子。假设表包含 200 万行。每小时在历史表中倾倒。

如果我想添加列 Category_13,这个解决方案不灵活,所以我正在考虑这个:

ID | topic_id | Category_id | vote_count

该解决方案将为每个主题创建 12 行,其结构更好且更灵活,但我必须每小时转储 2400 万行。

我需要每个类别中最好的 10 个主题!我想知道在案例 2 中使用 Max on votes(其中 category_id=x 和 topic_id=y)是否会比案例 1 慢: Order by categoy_x where topic_id=y

哪个会更好只是!从性能的角度来看:

  1. 拥有 200 万行 14 列
  2. 拥有 4 列的 2400 万行

谢谢

4

1 回答 1

3

我会查看检索模式来决定方法。

  1. 如果您按类别检索主题,那么我将采用第二种方法,在类别字段上定义索引,以便给定类别的所有记录连续(相对)存储在磁盘上,从而减少磁盘页数被取回。这也是因为与所有类别作为列的表相比,记录大小更小。优点是可以灵活地轻松添加更多类别,缺点是(ID,TopicID)列数据的重复会影响数据的总大小。

  2. 如果您按主题检索,那么我将采用第一种方法,在该主题上定义一个索引。这将减少每个类别的 (ID, TopicID) 列值的重复,从而减少要存储的数据的总大小,并且由于行数以每小时数百万为单位,这种大小的减少必须是显着的。缺点是需要修改新类别的架构。

编辑:考虑您编辑的检索模式:

我检索每个类别的热门主题及其值,因此我在案例 1 中按 votes_Category_x 排序。

我理解为Find the top N topics with largest number of votes in a given category

在案例 2 中,我会寻找每个 topic_id 的 max(category)。

而这作为SELECT TopicID, MAX(votes) FROM TABLE GROUP BY TopicID, Category

200 万行和 2400 万行的记录大小不同,但是是的,ID 和 TopicID 重复,这肯定会增加数据大小,每条记录增加 8 个字节。

第一个表存储 200 万条大小60 bytes (4*15 ints)的记录,第二个表存储 2400 万条大小的记录16 bytes (4*4 ints)。第二个表将每小时添加每个~62页面。4KB在一段时间内似乎是一个问题。由于在中间插入数据,这也会影响碎片,因为在第二种方法的情况下,索引是按类别组织的。

在继续使用其中一种表结构之前,可能值得进行一些性能测试以更好地理解这一点并权衡添加类别的频率。

于 2012-10-20T12:10:38.680 回答