MySQL / InnoDB:拥有两个非唯一索引列或将它们组合在唯一主键中更为理想?

时间:2012-11-02 00:09:36

标签: mysql innodb composite-primary-key database-indexes

我正在使用带有InnoDB的MySQL。

我在语义方面不需要主键,主键(或者更确切地说,唯一索引)是否比非唯一索引更快地进行查询?

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

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

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

例如,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更好吗?甚至使用整数?在内存访问方面,没有对齐,全字访问速度最快?这会产生影响吗?

1 个答案:

答案 0 :(得分:1)

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

对于数据类型,我会尽量减少。我不确定如何在内存中处理索引的细节,但是你可能无法测量由于内存访问差异导致的任何显着差异,并且较小的索引大小不会受到影响。