我正在使用带有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更好吗?甚至使用整数?在内存访问方面,没有对齐,全字访问速度最快?这会产生影响吗?
答案 0 :(得分:1)
无论你是否使用它,InnoDB总是有一个主键。 InnoDB使用聚簇索引来存储数据,这基本上意味着主键和数据在同一个地方。如果未定义合适的索引,则会创建内部索引。这也意味着主键是“免费的”;它不需要任何额外的空间,因为数据存储在索引中。如果始终使用两列来查找要更新的行,则应该创建复合主索引。即使您不是每次都使用两列来过滤数据,您也可能会从复合主索引中受益。
对于数据类型,我会尽量减少。我不确定如何在内存中处理索引的细节,但是你可能无法测量由于内存访问差异导致的任何显着差异,并且较小的索引大小不会受到影响。