为什么使用mysql向表中添加主键要比使用postgres慢得多?

为什么使用mysql向表中添加主键要比使用postgres慢得多?,mysql,postgresql,Mysql,Postgresql,目前,我正在使用DBGen生成数据库,该数据库将用于生成TPC-H基准测试。我正在将文件(原始数据直接从DBGen导入)导入mysql和postgres。导入数据后,我需要将主键和外键添加到现有表中 我使用最简单的命令添加主键和外键 根据我自己的经验,postgres的运行速度比mysql快得多(特别是处理大表,我的例子中是1.4GB的lineitem表)。 但有人知道为什么会这样吗? 这是否意味着这两个系统在尝试添加主键或外键时所做的事情非常不同?当您在MySQL中添加和删除主键时,它会重建整

目前,我正在使用DBGen生成数据库,该数据库将用于生成TPC-H基准测试。我正在将文件(原始数据直接从DBGen导入)导入mysql和postgres。导入数据后,我需要将主键和外键添加到现有表中

我使用最简单的命令添加主键和外键

根据我自己的经验,postgres的运行速度比mysql快得多(特别是处理大表,我的例子中是1.4GB的lineitem表)。 但有人知道为什么会这样吗?
这是否意味着这两个系统在尝试添加主键或外键时所做的事情非常不同?

当您在MySQL中添加和删除主键时,它会重建整个表——因此通过复制它来有效地重新导入它

除了一般限制(MyISAM也有这种情况),InnoDB存储为“集群主键”,也就是说,行在内部存储在基于主键的树中。。因此主键是表存储和排序方式的组成部分。。。因此,即使它可以在不复制所有内容的情况下以某种方式做到这一点,它也必须基本上完全重新组织所有内容

见:

我建议在导入数据之前添加主键,这样只需执行一次

您应该能够在线添加辅助索引和外键引用,而无需表副本。见:

您能告诉我们这个“最简单的命令”到底是什么吗?你有“更快”的数字吗?您要向其中添加键的表的结构是什么?有多少行(相对于有多少GB的数据)?ALTER TABLE TPCH.lineitem添加主键(l_orderkey,l_linenumber);mysql执行上述命令的时间是23分钟,我记不起postgres执行该命令需要多长时间,但可以肯定的是,时间要短得多。行数是1200万,16列(4 int,4 decimal,3 date,5 char/string,总共80个字符);