【问题标题】:Performance enhancements for tables表的性能增强
【发布时间】:2009-10-07 06:58:47
【问题描述】:
对于 MySQL,我经常忽略一些选项,例如“有符号/无符号”整数和“允许 null”,但我想知道这些细节是否会减慢 Web 应用程序的速度。
在这些情况下是否存在显着的性能差异?
- 使用整数主键的低/高范围
- 5000 行,ID 从 1 到 5000
- 5000 行,ID 从 20001 到 25000
- 整数 PK 均匀递增与非均匀递增。
- 5000 行,ID 从 1 到 5000
- 5000 行,id 分布在 1 到 30000 之间
- 将整数 PK 设置为无符号与有符号
- 为字段(任何类型)设置默认值与无默认值
- 允许 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 声明为UNSIGNED,MySQL 可以优化出诸如id >= -1 之类的谓词
为字段(任何类型)设置默认值与无默认值
* 示例:更新一行并给出所有字段数据
没有区别。
允许 Null 与拒绝 Null
* 示例:更新一行并给出所有字段数据
可为空的列大一个字节:INT NOT NULL 的索引键长 5 字节,INT NULL 的索引键长 4 字节。 p>