繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM