创建一个索引,它是MySQL中另一个索引的子集

时间:2012-06-18 06:50:33

标签: mysql indexing

我正在使用MySQL,但我怀疑这是一个通用的数据库问题。

我有一个由6个数字列组成的表。其中前5个组成了主键。

它是一个大表(2000万行并且在增长),所以有些查询需要时间 - 大约10秒,这本身不会太长,但我需要运行很多。

我知道主键是自动编入索引的 - 在我通常查询的主键中单独索引某些列组是否有任何优势?

也就是说,如果我经常查询5个主键列中的前3个,我应该为这些3创建一个额外的索引,还是因为它已经是主键索引的一部分而是多余的?

2 个答案:

答案 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是否正在按照您的预期执行查询。

http://dev.mysql.com/doc/refman/5.1/en/explain.html

答案 1 :(得分:0)

为什么不创建一些测试查询,在表的副本上创建索引并查看它的执行情况?

在绩效方面,衡量总是比信任意见更好。

数据库中的“最佳”解决方案在很大程度上取决于所涉及的表的具体细节。列中的值范围,值的分布,查询的类型,选择/删除/插入/更新查询的相对频率等。

话虽如此,我的猜测是,如果该子集包含查询中使用的所有列,则子集上的索引将有所帮助。如果在索引中包含结果集(select中的列),则可能会获得更好的性能。