【问题标题】:Performance enhancements for tables表的性能增强
【发布时间】:2009-10-07 06:58:47
【问题描述】:

对于 MySQL,我经常忽略一些选项,例如“有符号/无符号”整数和“允许 null”,但我想知道这些细节是否会减慢 Web 应用程序的速度。

在这些情况下是否存在显着的性能差异?

  1. 使用整数主键的低/高范围
    • 5000 行,ID 从 1 到 5000
    • 5000 行,ID 从 20001 到 25000
  2. 整数 PK 均匀递增与非均匀递增。
    • 5000 行,ID 从 1 到 5000
    • 5000 行,id 分布在 1 到 30000 之间
  3. 将整数 PK 设置为无符号与有符号
    • 示例:实际上不需要无符号范围内的增益
  4. 为字段(任何类型)设置默认值与无默认值
    • 示例:更新一行并给出所有字段数据
  5. 允许 Null 与拒绝 Null
    • 示例:更新一行并给出所有字段数据

我正在使用 MySQL,但这是一个比较笼统的问题。

【问题讨论】:

    标签: mysql performance database-design primary-key


    【解决方案1】:

    根据我对 B 树的理解(关系数据库通常是这样实现的,对吗?),这些东西应该没有任何区别。您所需要的只是您的密钥上的快速比较功能,而且您使用的整数范围通常无关紧要(除非您超出了机器字长)。

    当然,对于键,统一的默认值或允许 null 没有多大意义。在所有非关键字段中,允许 null 或提供默认值不应产生任何重大影响。

    【讨论】:

      【解决方案2】:

      5000 行对于数据库来说几乎是零。他们通常使用大型 B 树作为索引,因此他们不太关心主键的分布。

      一般来说,是否使用其他选项应该基于您对数据库应用程序的需要。它们不会显着影响性能。因此,当您需要默认值时使用默认值,当您不希望列为 NULL 时使用 NOT NULL 约束。

      如果您有数据库性能问题,您应该寻找更重要的问题,例如缺少索引、可以高效重写的慢查询、确保数据库具有准确的数据统计信息,以便正确使用索引(尽管这是一项管理任务)。

      【讨论】:

        【解决方案3】:

        使用整数主键的低/高范围 * 5000 行,ID 为 1 到 5000 * 5000 行,id 从 20001 到 25000

        没有任何区别。

        整数 PK 均匀递增与非均匀递增。 * 5000 行,ID 为 1 到 5000 * 5000 行,id 分布在 1 到 30000 之间

        如果分布是均匀的,这没有区别。

        均匀分布可能有助于构建更有效的随机抽样查询,如我博客中的这篇文章所述:

        重要的是分布,而不是界限:1, 11, 21, 31 可以,1, 2, 3, 31 不行。

        将整数 PK 设置为无符号与有符号 * 示例:实际上不需要无符号范围内的增益

        如果将PRIMARY KEY 声明为UNSIGNEDMySQL 可以优化出诸如id >= -1 之类的谓词

        为字段(任何类型)设置默认值与无默认值 * 示例:更新一行并给出所有字段数据

        没有区别。

        允许 Null 与拒绝 Null * 示例:更新一行并给出所有字段数据

        可为空的列大一个字节:INT NOT NULL 的索引键长 5 字节,INT NULL 的索引键长 4 字节。 p>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 2012-08-22
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          相关资源
          最近更新 更多