表的性能增强

时间:2009-10-07 06:58:48

标签: mysql performance database-design primary-key

使用MySQL我常常会忽略一些选项,比如'signed / unsigned'ints和'allow null',但我想知道这些细节是否会降低Web应用程序的速度。

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

  1. 使用低/高范围的Integer主键
    • 5000行,ID为1到5000
    • 5000行,ID为20001到25000
  2. 整数PK均匀递增与非均匀递增。
    • 5000行,ID为1到5000
    • 5000行,其中ID分散在1到30000
    • 之间
  3. 将整数PK设置为unsigned与signed
    • 示例:实际上不需要无符号范围的增益
  4. 为字段(任何类型)设置默认值,而不是默认值
    • 示例:更新行并提供所有字段数据
  5. 允许Null vs deny Null
    • 示例:更新行并提供所有字段数据
  6. 我正在使用MySQL,但这更像是一个普遍的问题。

3 个答案:

答案 0 :(得分:1)

根据我对B树的理解(通常是关系数据库的实现方式,对吧?),这些事情应该没有任何区别。您只需要在键上使用快速比较功能,通常使用的整数范围无关紧要(除非您超出机器字大小)。

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

答案 1 :(得分:1)

5000行对于数据库几乎没有任何意义。它们通常使用大型B树作为索引,因此他们不关心很多关于主键的分布。

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

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

答案 2 :(得分:0)

  

使用低/高范围的Integer主键             * 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声明为UNSIGNED MySQL 可以优化id >= -1

之类的谓词
  

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

没有区别。

  

允许Null vs deny Null             *示例:更新行和所有字段数据

Nullable列大一个字节:INT NOT NULL的索引键长 5 字节,INT NULL的索引键 4 字节长。