我收集人们如何用表格中的类别标记主题,如:
ID | topic_id | votes_Category_1 | votes_Category_2 |.......... | votes_Category_12
由于历史原因,我每小时都会丢弃这张桌子.
让我们说表包含200万行.在历史表中每小时倾倒一次.
如果我想添加Column_13列,这个解决方案不灵活,所以我在考虑这个:
ID | topic_id | Category_id | vote_count
此解决方案将为每个主题创建12行,其结构更好,更灵活,但我必须每小时转储2400万行.
我需要每个类别中最好的10个主题!
我想知道在案例2中使用Max on votes(其中category_id = x和topic_id = y)将比情况1慢:按categoy_x排序其中topic_id = y
哪一个会更好JUST !!!从表现角度来看:
>拥有包含14列的200万行
>拥有4列的2400万行
谢谢
最佳答案 我会看一下检索模式来决定方法.
>如果按类别检索主题,那么我将采用第二种方法,在类别字段上定义索引,以便将给定类别的所有记录连续(相对)存储在磁盘上,从而减少磁盘页数要检索.这也是因为与所有类别作为列的表相比,记录大小更小.优点是可以轻松添加更多类别,并且缺点是重复(ID,TopicID)列数据会影响数据的总大小.
>如果按主题检索,那么我会采用第一种方法,定义主题的索引.这将减少每个类别的(ID,TopicID)列值的重复,从而减少要存储的数据的总大小,并且由于行数以每小时数百万计,因此这种尺寸的减小必须是显着的.缺点是需要修改新类别的架构.
编辑:
考虑编辑中的检索模式:
I retrieve top topics and their values per Category so i order by votes_Category_x in case 1.
我理解这是在给定类别中查找具有最大投票数的前N个主题
In case 2 I would look to find max(category) for each topic_id.
这是SELECT TopicID,MAX(投票)FROM TABLE GROUP BY TopicID,Category.
记录的大小对于2百万行和24百万行是不同的,但是,重复ID和TopicID,这肯定会增加数据大小,每个记录增加8个字节.
第一个表存储200万个记录,每个记录大小为60字节(4 * 15英寸),第二个表存储2400万条记录,每个记录大小为16字节(4 * 4英寸).第二个表每小时将添加约62页,每页4KB.在一段时间内似乎是一种担忧.这也将影响由于在中间插入数据而导致的碎片,因为在第二种方法的情况下索引按类别进行组织.
在继续使用其中一个表结构之前,可能值得运行一些性能测试以更好地理解这一点,并且还要考虑添加类别的频率.