我正在使用MySQL,但我怀疑这是一个通用的数据库问题。
我有一个由6个数字列组成的表。其中前5个组成了主键。
它是一个大表(2000万行并且在增长),所以有些查询需要时间 - 大约10秒,这本身不会太长,但我需要运行很多。
我知道主键是自动编入索引的 - 在我通常查询的主键中单独索引某些列组是否有任何优势?
也就是说,如果我经常查询5个主键列中的前3个,我应该为这些3创建一个额外的索引,还是因为它已经是主键索引的一部分而是多余的?
答案 0 :(得分:3)
对于返回一行或少量行的查询,十秒钟是相当长的时间。但是,如果查询返回表格内容的3%,则十秒不会太长。
您的主要唯一键由复合索引备份,例如
上的索引 (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是否正在按照您的预期执行查询。
答案 1 :(得分:0)
为什么不创建一些测试查询,在表的副本上创建索引并查看它的执行情况?
在绩效方面,衡量总是比信任意见更好。
数据库中的“最佳”解决方案在很大程度上取决于所涉及的表的具体细节。列中的值范围,值的分布,查询的类型,选择/删除/插入/更新查询的相对频率等。
话虽如此,我的猜测是,如果该子集包含查询中使用的所有列,则子集上的索引将有所帮助。如果在索引中包含结果集(select中的列),则可能会获得更好的性能。