多列索引是否比单列索引慢?

时间:2013-08-09 13:42:05

标签: mysql

我在(A, B)上有一个主键,其中AINTBINT。如果我在A上有索引,那么在A上搜索的查询会运行得更快吗?

我理解最左边的前缀规则,但我很好奇多列密钥/索引的表现比单列密钥/索引差,因为密钥更长。

2 个答案:

答案 0 :(得分:1)

在某些情况下,如果列的其余部分很大,它可能会表现得更糟,例如: 答:int,B:varchar(128),C:文本 A上的索引将比A,B,C上的索引表现更好

在大多数情况下,它表现相同;在你的情况下你有4对8字节,所以有第二个索引的开销是不值得的。

请记住,主键的表现优于辅助索引,尤其是当存储引擎是InnoDB(主键是群集索引)并且它不是覆盖查询时(它必须访问表以加载未存储的数据)在索引中)

实际上在InnoDB中,所有二级索引都包含主键,因此默认情况下它们大于PK。

答案 1 :(得分:1)

您遇到复合键有两个组件的情况。第一个是4个字节,第二个是4个字节。总密钥是8个字节。

主键索引是聚簇的,这意味着b树的“叶子”是实际的记录本身。与其他类型的索引相比,聚簇索引的访问速度更快。

索引性能的一个考虑因素是密钥的大小(以及索引中保留的其他列)。具有4字节密钥的索引将小于具有8字节密钥的索引。这意味着磁盘使用量减少,内存存储量减少。但是,这里的收益可能非常小。毕竟,表中的一百万行最多对应一个10-20万字节(索引中有额外的开销)。

另一个考虑因素是数据修改步骤的性能。在聚簇索引中,在表的中间插入/修改键值需要重写记录本身。但是,您的问题似乎不是地址数据修改。

如果您已经定义了主键索引,那么添加另一个索引是系统的额外开销。您可能会发现两个索引都占用内存,因此您实际上不会节省空间。

最终,这类相当神秘的问题的答案是做一些时间测试。如果B列比A组件大得多,那么我可能会看到一些收益。对于使用A的查询,我可能会看到一些收益。但是,我的猜测是这样的收益很小。