我正在使用 MySQL,尽管我怀疑这是一个通用的数据库问题。
我有一个由 6 个数字列组成的表。其中前 5 个构成主键。
这是一个大表(2000 万行并且还在增长),所以一些查询需要时间 - 大约 10 秒,这本身并不太长,但我需要运行很多。
我知道主键是自动索引的 - 我单独索引我通常查询的主键中的某些列组有什么优势吗?
也就是说,如果我定期查询 5 个主键列中的前 3 个,我应该为这 3 个创建额外的索引,还是因为它已经是主键索引的一部分,所以这是多余的?
对于返回一行或少量行的查询来说,十秒是相当长的时间。但是,如果查询返回表内容的 3%,那么 10 秒不会太长。
您的主唯一键由复合索引备份,假设索引
(I1,I2,I3,I4,I5)
你是对的,像这样的查询
WHERE I1 = val AND I2 = val AND I3 = val
和
WHERE I3 = val AND I2 = val AND I1 = val
应该使用为主键创建的索引。重要的是复合索引中的列都被使用了,从最左边开始。像这样的查询
WHERE I3 = val AND I4 = val AND I5 = val
如果有的话,不会很好地使用主键的复合索引。对键中提到的列值进行某种计算的查询也不会,例如
WHERE I1+I2+I3=sumvalue
请记住,“应该有效”与“有效”不同。尝试在 MySQL 中使用 EXPLAIN 命令来确定 DBMS 是否按照您的预期执行查询。
为什么不只创建一些测试查询,在表的副本上创建索引并查看它的执行情况?
在绩效方面,衡量总是比相信意见更好。
数据库中的“最佳”解决方案很大程度上取决于所涉及表的具体细节。列中值的范围、值的分布、查询类型、选择/删除/插入/更新查询的相对频率等。
话虽如此,我的猜测是,如果该子集包含查询中使用的所有列,则子集上的索引将有所帮助。如果在索引中包含结果集(选择中的列),您可能会获得更好的性能。