2009-09-30 43 views
0

我有一个MySQL(InnoDB的)表“项目”具有以下特点这个数据模型的性能好处是什么?

  1. 数量众多,且不断增加。
  2. 大量的各种数据类型的列,包括'文本';
  3. 主键'item_id'存在。

有额外的要求如下:根据他们的状态

  • 需要更新状态
  • 以上两种操作相当频繁发生

    1. 需要查询的项目。

      鉴于以上情况,我有两个问题

      1. 将制作一个单独的表有两列,即item_idstatusitem_id作为主键提供了更高的性能?
      2. 如果以上情况属实,我将如何根据状态解决查询item_ids的问题?

      我在处理数据库方面经验不足。我希望你能忍受我:)

    回答

    3

    这被称为垂直分割。当数据实体具有多种访问模式时,通常使用它,访问模式以不同的频率访问实体属性(表列)的不同子集。如果一个功能每秒只需要访问一个或两个列100次,而另一个应用程序功能需要访问所有其他列,但一天只能访问一次或两次,那么这种方法是有说服力的,并且会获得显着的性能改进。

    基本上,如您所建议的那样,您将表格“拆分”为两个表格,这两个表格都使用相同的键,具有一对一的FK/PK-> PK关系。在一张表中,您只放入那些频繁访问的列,并且将其余列放在另一个将不太频繁访问的表中。然后,您可以根据每个表的实际访问模式分别对每个表更合适地应用索引。

    +0

    感谢您的回答。 – nano 2009-09-30 19:56:18

    1

    如果你的状态和你的item_id是唯一需要获取的列,那么创建一个索引会更有意义。

    create index status_item_id_items on items (status) 
    

    然后,您可以查询你的结果将使用该索引:

    select item_id, status from items where status = 'status' 
    

    请记住,如果你没有很多不同的状态您的查询可能最终返回了大量行和可能会很慢。如果你可以像日期时间那样受到更多的“选择性”列的约束,那会更好。

    +0

    谢谢文森特。但是,如果我索引item_id和状态,不会更新表的状态值越慢,随着表的大小增加? 或者它不重要,因为它只有两列? – nano 2009-09-30 19:57:38

    +0

    为了一次更新一行,这可能是您的用例,它应该可以忽略不计。这是事实,你有更多的索引来更新,但创建一个新的表会花费更多。 – Vincent 2009-09-30 20:03:45

    +0

    谢谢。非常感谢您的帮助。 – nano 2009-09-30 20:06:59

    0

    接听第2部分第一次,你会做一个内部联接的两个表:

    SELECT i.*, s.StatusCode FROM items AS i INNER JOIN status AS s ON s.item_id = i.item_id 
    

    要回答第1部分,不过,我不认为这样做会得到你的任何性能优势。

    相关问题