Database 关于数据库性能

Database 关于数据库性能,database,Database,早上好 我现在正在写我的硕士论文,因此我必须证明我所做的每一个总体评估是正确的 我在MySQL中有一个平面数据库,它最初由以下字段组成 日期(日期时间) 姓名(VARCHAR(50)) 价值(双倍) 表中的PK是第1列和第2列的组合 问题是,我很快就有了4000多万行,我对一个名字上的所有记录的查询都需要很长时间 因此,我决定创建一个“索引表”(我认为术语是正确的),其中存储名称和ID之间的映射: ID(INT) 名称(VARCHAR 50) 我把我的初始表格改为 日期(日期时间) ID(INT

早上好

我现在正在写我的硕士论文,因此我必须证明我所做的每一个总体评估是正确的

我在MySQL中有一个平面数据库,它最初由以下字段组成

  • 日期(日期时间)
  • 姓名(VARCHAR(50))
  • 价值(双倍)
  • 表中的PK是第1列和第2列的组合

    问题是,我很快就有了4000多万行,我对一个名字上的所有记录的查询都需要很长时间

    因此,我决定创建一个“索引表”(我认为术语是正确的),其中存储名称和ID之间的映射:

  • ID(INT)
  • 名称(VARCHAR 50)
  • 我把我的初始表格改为

  • 日期(日期时间)
  • ID(INT)
  • 价值(双倍)
  • 通过这种方式,我可以首先找到我要查找的记录的ID,然后非常快地在大表上运行查询(性能确实要好得多)

    我认为这是因为整数之间的比较比字符串之间的比较容易得多,但我正在寻找一些文献来支持这一评估(理想情况下是一些数据库结构书)


    你认为我的评估正确吗

    问题的一部分是复合键(如日期、名称PK)是通过连接索引值创建的(请参见),而名称(您在此查找的主要内容)是第二个。这使得按名称查找内容的工作更为繁重,因为索引不会按名称排序,而是按日期排序,然后按名称排序,这意味着mysqld必须搜索整个索引,而不是只抓取PK介于“Jack,0000-00-00”和“Jack,9999-12-31”之间的部分

    如果只为名称添加索引,或者至少将PK切换到(名称、日期),您可能会发现原来的表工作得更好


    或者,如果您对日期ID表执行了相同的操作,那么应该会更快,因为您几乎消除了字符串比较。

    问题的一部分是,复合键(例如日期、名称PK)是通过连接索引值(请参阅)和名称(此处查找的主要内容)创建的第二名。这使得按名称查找内容的工作更为繁重,因为索引不会按名称排序,而是按日期排序,然后按名称排序,这意味着mysqld必须搜索整个索引,而不是只抓取PK介于“Jack,0000-00-00”和“Jack,9999-12-31”之间的部分

    如果只为名称添加索引,或者至少将PK切换到(名称、日期),您可能会发现原来的表工作得更好


    或者,如果对日期ID表执行相同的操作,则速度应该更快,因为您几乎消除了字符串比较。

    假设“Name”字段中有大量重复数据,由于整数比较比字符串比较快,并且大大减少了日期表的大小,因此查询性能有所提高。这意味着更少的内存分页和更少的磁盘查找

    如果名称表有N行,那么您正在进行N个字符串比较,加上4000万个整数比较,而不是4000万个字符串比较。要进一步提高查询性能,应该为日期表的ID字段添加索引

    CREATE INDEX date_id_index ON date_table (ID)
    

    假设“Name”字段中有大量重复数据,查询性能会得到提高,因为整数比较比字符串比较快,并且大大减少了日期表的大小。这意味着更少的内存分页和更少的磁盘查找

    如果名称表有N行,那么您正在进行N个字符串比较,加上4000万个整数比较,而不是4000万个字符串比较。要进一步提高查询性能,应该为日期表的ID字段添加索引

    CREATE INDEX date_id_index ON date_table (ID)
    

    至于书籍,Lex de Haan和Toon Koppelaars的著作是非常好的书,如果您需要高级SQL知识的话。我应该指出,你不只是“提及”书籍,你阅读它们并将它们作为参考——仅仅参考书籍,因为它们听起来很酷,但不阅读它们会反过来咬你的屁股。

    至于书籍,如果你想要高级SQL知识,Lex de Haan和Toon Koppelaars的著作确实是一本好书。我要指出的是,你不只是“提及”书籍,你阅读它们并将它们作为参考——仅仅参考书籍,因为它们听起来很酷,但不阅读它们,会让你反目成仇。

    事实上,新的PK确实是(ID,Date)而不是(Date,ID)。我现在所做的是,我将(ID,Date)作为PK,并为ID和Date创建一个单独的索引,因为查询名称和查询日期一样常见。但是你认为,从本质上讲,PK(ID,日期)通常比PK(名称,日期)好吗?@JSmega:如果你对性能感兴趣,是的——它会更快。不过,这会使数据检索稍微复杂一些,所以我会检查两者的性能,看看是否值得添加额外的表(以及额外的连接和/或查找)。好的,谢谢。关于MySQL中字符串比较的复杂性,我能提供一个好的参考吗?@JSmaga:我能提供的唯一参考是MySQL手册。它解释了如何比较字符串(即,使用列、表、会话或DB默认值指定的排序规则,按照优先顺序比较VARCHAR和CHAR列)。我现在所做的是,我将(ID,Date)作为PK,并为ID和Date创建一个单独的索引,因为查询名称和查询日期一样常见。但是你认为,从本质上讲,PK(ID,日期)通常比PK(名称,日期)好吗?@JSmega:如果你对性能感兴趣,是的——它会更快。不过,这会使数据检索稍微复杂一些,所以我会检查两者的性能,然后看看