Mysql 表的性能增强
对于MySQL,我经常忽略一些选项,如“signed/unsigned”int和“allow null”,但我想知道这些细节是否会降低web应用程序的速度 在这些情况下是否存在显著的性能差异Mysql 表的性能增强,mysql,performance,database-design,primary-key,Mysql,Performance,Database Design,Primary Key,对于MySQL,我经常忽略一些选项,如“signed/unsigned”int和“allow null”,但我想知道这些细节是否会降低web应用程序的速度 在这些情况下是否存在显著的性能差异 使用整数主键的低/高范围 5000行,ID从1到5000 5000行,ID从20001到25000 整数PK一致递增与非一致递增。 5000行,ID从1到5000 5000行,ID分布在1到30000之间 将整数PK设置为无符号与有符号 示例:实际不需要unsigned的增益范围 为字段(任何类
- 5000行,ID从1到5000
- 5000行,ID从20001到25000
- 5000行,ID从1到5000
- 5000行,ID分布在1到30000之间
- 示例:实际不需要unsigned的增益范围
- 示例:更新一行并给出所有字段数据
- 示例:更新一行和所有字段数据
我使用的是MySQL,但这更像是一个一般性问题。根据我对B树的理解(关系数据库通常就是这样实现的,对吧?),这些东西应该不会有任何区别。你所需要的只是在你的键上有一个快速的比较函数,而且你使用的整数范围通常并不重要(除非你超出了机器字的大小)
当然,对于键,统一的默认值或允许null没有多大意义。在所有非关键字段中,允许null或提供默认值不会产生任何重大影响。5000行对于数据库来说几乎没有任何意义。它们通常使用大型B树作为索引,因此它们不太关心主键的分布 通常,是否使用其他选项应根据您对数据库应用程序的需求而定。它们不会显著影响性能。因此,当需要默认值时使用默认值,当不希望列为
NULL
时使用notnull
约束
如果您有数据库性能问题,您应该查找更重要的问题,如缺少索引、可以有效重写的查询速度慢,确保数据库具有关于数据的准确统计信息,以便能够以正确的方式使用索引(尽管这是一项管理任务)
使用整数主键的低/高范围
*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设置为无符号与有符号
*示例:实际不需要unsigned的增益范围
如果将PRIMARY KEY
声明为UNSIGNED
,MySQL可以优化出像id>=-1这样的谓词
为字段(任何类型)设置默认值与无默认值
*示例:更新一行并给出所有字段数据
没有区别
允许空与拒绝空
*示例:更新一行和所有字段数据
可为空的列大一个字节:INT NOT NULL
的索引键长度5字节,而INT NULL
的索引键长度4字节