【问题标题】:Performance benefit in this data model?此数据模型的性能优势?
【发布时间】:2009-10-01 03:54:32
【问题描述】:

我有一个具有以下特征的 MySQL(innodb) 表“项目”

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

还有以下附加要求:

  1. 需要根据状态查询项目
  2. 需要更新状态

以上两种操作发生的频率很高。

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

  1. 是否会创建一个包含两列(即item_idstatus)的单独表,并以item_id 作为主键来提高性能?
  2. 如果上述情况属实,我将如何处理根据状态查询 item_ids?

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

【问题讨论】:

    标签: sql mysql database-design data-modeling


    【解决方案1】:

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

    基本上,正如您所建议的,您将表“拆分”为两个表,两个表都具有相同的键,具有一对一的 FK/PK->PK 关系。在一个表中,您只放置访问频率较高的少数列,而将其余列放置在另一个访问频率较低的表中。然后,您可以根据每个表的实际访问模式分别更适当地为每个表应用索引。

    【讨论】:

      【解决方案2】:

      如果您需要获取的唯一列,则在您的状态和 item_id 上创建索引会更有意义。

      create index status_item_id_items on items (status)
      

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

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

      请记住,如果您没有很多不同的状态,您的查询最终可能会返回很多行并且可能会很慢。如果您可以受到诸如日期时间之类的更具“选择性”的列的约束,那就更好了。

      【讨论】:

      • 谢谢文森特。但是,如果我同时索引 item_id 和状态,随着表大小的增加,更新状态值不会变慢吗?或者因为它只有两列,所以它不会很重要?
      • 对于一次更新一行,这可能是您的用例,它应该可以忽略不计。确实,您还有一个索引要更新,但创建一个新表会花费更多。
      • 谢谢。非常感谢您的帮助。
      【解决方案3】:

      首先回答第 2 部分,您将对两个表进行内部连接:

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

      不过,要回答第 1 部分,我认为这样做不会为您带来任何性能优势。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 2010-11-03
        • 2012-03-19
        • 2010-10-20
        • 2011-03-21
        • 2011-10-05
        • 1970-01-01
        • 2011-12-07
        相关资源
        最近更新 更多