使用MySQL我常常会忽略一些选项,比如'signed / unsigned'ints和'allow null',但我想知道这些细节是否会降低Web应用程序的速度。
在这些情况下是否存在显着的性能差异?
我正在使用MySQL,但这更像是一个普遍的问题。
答案 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 字节长。