[英]Rationale behind difference between unique and non-unique indexes in MySQL InnoDB next-key locking
[英]MySQL/InnoDB: more optimal to have two non-unique index columns or combine them in unique primary key?
我正在将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。 但是,我不确定当合并到单个索引中时,使用小于整数类型以及不同类型会对性能产生什么影响。 该手册说,多列用于主键时是串联的。 使用同一类型,smallint更好吗? 甚至使用整数? 就内存访问而言,不对齐,全字访问最快吗? 这对这里有影响吗?
不管您是否使用它,InnoDB总是有一个主键。 InnoDB使用聚集索引来存储数据,这基本上意味着主键和数据位于同一位置。 如果您没有定义合适的索引,它将创建一个内部索引。 这也意味着主键是“免费的”。 由于数据存储在索引中,因此不需要任何额外的空间。 如果您总是通过两列都找到要更新的行,则绝对应该制作一个复合主索引。 即使您不每次都使用两列来过滤数据,您也可能会从复合主索引中受益。
至于数据类型,我会尽量减小两者。 我不确定如何在内存中处理索引的细节,但是由于内存访问差异,您可能将无法测量任何重大差异,较小的索引大小也不会受到影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.