我在(A, B)
上有一个主键,其中A
是INT
而B
是INT
。如果我在A
上有索引,那么在A
上搜索的查询会运行得更快吗?
我理解最左边的前缀规则,但我很好奇多列密钥/索引的表现比单列密钥/索引差,因为密钥更长。
答案 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
的查询,我可能会看到一些收益。但是,我的猜测是这样的收益很小。