0

我将 MySQL 与 InnoDB 一起使用。

就语义而言,我不需要主键,那么主键(或者更确切地说,唯一索引)是否比非唯一索引更快查询?

我有两列适合索引但不唯一。但是,两列的组合始终是唯一的。这些列也是非空的。

将两个非唯一列设置为索引,还是在两列的组合上创建一个主键更好?

访问模式通常会修改两行或四行,其中第一列是给定值(第二列将不同,正如我提到的每个组合都是唯一的)。

例如, col1 和 col2 就像

1 1
1 2
1 3
1 5
2 1
2 2
2 3
2 5
3 1
3 2
3 3

一个示例是一次更改行 (1, 2) 和 (1, 3)

一个后续问题是关于数据类型的。col1 适合 smallint, col2 适合 tinyint。但是,我不确定在组合成单个索引时使用小于 int 类型和不同类型的性能影响是什么。该手册说,当用于主键时,多个列被连接起来。使用相同的类型smallint会更好吗?甚至使用整数?在内存访问方面,不对齐,全字访问最快?这对这里有影响吗?

4

1 回答 1

1

无论你是否使用它,InnoDB 总是有一个主键。InnoDB 使用聚集索引来存储数据,这基本上意味着主键和数据在同一个地方。如果您没有定义合适的索引,它会创建一个内部索引。这也意味着主键是“免费的”;它不需要任何额外的空间,因为数据存储在索引中。如果您总是通过使用两列来找到要更新的行,那么您绝对应该创建一个复合主索引。即使您不是每次都使用两列来过滤数据,您也可能会从复合主索引中受益。

至于数据类型,我会让两者都尽可能小。我不确定如何在内存中处理索引的具体细节,但由于内存访问差异,您可能无法测量任何显着差异,并且较小的索引大小不会受到伤害。

于 2012-11-02T00:30:00.650 回答