MySQL数据库结构:更多列或更多行

时间:2012-10-20 11:59:18

标签: mysql sql performance

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

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(其中category_id = x和topic_id = y)将比在案例1中慢:按categoy_x排序,其中topic_id = y

哪一个会更好JUST !!!从绩效角度来看:

  1. 拥有包含14列的200万行
  2. 拥有2,400万行,包含4列
  3. 谢谢

1 个答案:

答案 0 :(得分:2)

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

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

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

  3. 修改: 考虑编辑中的检索模式:

      

    我检索每个类别的热门主题及其值,以便我在第1种情况下通过votes_Category_x订购。

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

      

    在第2种情况下,我会查找每个topic_id的最大值(类别)。

    这是SELECT TopicID, MAX(votes) FROM TABLE GROUP BY TopicID, Category

    记录的大小对于2百万行和24百万行是不同的,但是是的,重复ID和TopicID,这肯定会增加数据大小,每个记录增加8个字节。

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

    在继续使用其中一个表结构之前,可能需要运行一些性能测试来更好地理解这一点并且还要考虑添加类别的频率。