Sql 此数据模型中的性能优势?

Sql 此数据模型中的性能优势?,sql,mysql,database-design,data-modeling,Sql,Mysql,Database Design,Data Modeling,我有一个MySQL(innodb)表'items',具有以下特征 大量的行,并不断增加 各种数据类型的大量列,包括“文本” 主键“item_id”存在 还有以下额外要求: 需要根据其状态查询项目 需要更新状态 上述两种操作经常发生 鉴于上述情况,我有两个问题 将item\u id和status这两列作为主键创建一个单独的表是否可以提高性能 如果以上是真的,我将如何处理基于状态的查询item_id 我在处理数据库方面缺乏经验。我希望您能接受我的建议:)如果您只需要获取列,那么在您的状态和项目id上

我有一个MySQL(innodb)表'items',具有以下特征

  • 大量的行,并不断增加
  • 各种数据类型的大量列,包括“文本”
  • 主键“item_id”存在 还有以下额外要求:

  • 需要根据其状态查询项目
  • 需要更新状态
  • 上述两种操作经常发生

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

  • item\u id
    status
    这两列作为主键创建一个单独的表是否可以提高性能
  • 如果以上是真的,我将如何处理基于状态的查询item_id

  • 我在处理数据库方面缺乏经验。我希望您能接受我的建议:)

    如果您只需要获取列,那么在您的状态和项目id上创建索引会更有意义

    create index status_item_id_items on items (status)
    
    然后,您可以查询将使用此索引的结果:

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

    请记住,如果您没有很多不同的状态,您的查询可能会返回很多行,并且可能会很慢。如果你可以被一个更具“选择性”的列(如datetime)约束,那就更好了。

    如果你只需要获取列,那么在你的状态和项目id上创建一个索引会更有意义

    create index status_item_id_items on items (status)
    
    然后,您可以查询将使用此索引的结果:

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

    请记住,如果您没有很多不同的状态,您的查询可能会返回很多行,并且可能会很慢。如果您可以被一个更具“选择性”的列(如datetime)约束,那就更好了。

    首先回答第2部分,您需要对两个表进行内部联接:

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

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

    首先回答第2部分,您需要对两个表进行内部联接:

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

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

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


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

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


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

    谢谢。但是如果我同时为item_id和status编制索引,那么随着表的增大,更新status值的速度会变慢吗?或者,由于它只有两列,这不是很重要吗?对于一次更新一行(这可能是您的用例),它应该可以忽略不计。确实,您还有一个索引要更新,但是创建一个新表的成本要高很多。谢谢。非常感谢你的帮助,谢谢文森特。但是如果我同时为item_id和status编制索引,那么随着表的增大,更新status值的速度会变慢吗?或者,由于它只有两列,这不是很重要吗?对于一次更新一行(这可能是您的用例),它应该可以忽略不计。确实,您还有一个索引要更新,但是创建一个新表的成本要高很多。谢谢。非常感谢你的帮助。