MySQL/InnoDB:最好有两个非唯一索引列,或者将它们组合在唯一主键中?
我在InnoDB中使用MySQL 就语义而言,我不需要主键,那么主键(或者更确切地说,唯一索引)比非唯一索引能更快地进行查询吗 我有两列适合索引,但不是唯一的。然而,这两列的组合总是唯一的。这些列也是非空的 只是将两个非唯一列设置为索引更好,还是在两列的组合上创建主键更好 访问模式通常会修改两行或四行,其中第一列是给定的值(第二列是不同的,正如我提到的,每个组合都是唯一的) 例如,col1和col2是相似的 11MySQL/InnoDB:最好有两个非唯一索引列,或者将它们组合在唯一主键中?,mysql,innodb,composite-primary-key,database-indexes,Mysql,Innodb,Composite Primary Key,Database Indexes,我在InnoDB中使用MySQL 就语义而言,我不需要主键,那么主键(或者更确切地说,唯一索引)比非唯一索引能更快地进行查询吗 我有两列适合索引,但不是唯一的。然而,这两列的组合总是唯一的。这些列也是非空的 只是将两个非唯一列设置为索引更好,还是在两列的组合上创建主键更好 访问模式通常会修改两行或四行,其中第一列是给定的值(第二列是不同的,正如我提到的,每个组合都是唯一的) 例如,col1和col2是相似的 11 1.2 13 15 2.1 2 2.3 2.5 31 3.2 3 3 例如,一次更
1.2
13
15
2.1
2
2.3
2.5
31
3.2
3 3 例如,一次更改行(1,2)和(1,3)
接下来的问题是关于数据类型。col1适合小字体,col2适合小字体。但是,我不确定当组合到单个索引中时,使用小于int的类型以及不同的类型会对性能产生什么影响。手册中说,当用于主键时,多个列是连接在一起的。使用同一类型smallint更好吗?甚至使用ints?在内存访问方面,没有对齐,全字访问速度最快?这对这里有影响吗?无论您是否使用它,InnoDB总是有一个主键,类似于。InnoDB使用聚集索引存储数据,这基本上意味着主键和数据位于同一位置。如果没有定义合适的索引,它将创建一个内部索引。这也意味着主键是“自由”的;它不需要任何额外的空间,因为数据存储在索引中。如果总是使用这两列来查找要更新的行,那么一定要创建一个复合主索引。即使不是每次都使用两列来过滤数据,也可能会从复合主索引中获益 至于数据类型,我会使两者尽可能小。我不确定在内存中如何处理索引的具体细节,但您可能无法测量由于内存访问差异而产生的任何显著差异,较小的索引大小也不会有任何影响