创建作为MySQL中另一个索引子集的索引

创建作为MySQL中另一个索引子集的索引,mysql,indexing,Mysql,Indexing,我正在使用MySQL,尽管我怀疑这是一个通用的数据库问题 我有一个由6个数字列组成的表。其中前5个组成主键 这是一个很大的表(2000万行并且还在增长),所以一些查询需要时间——大约10秒,这本身并不太长,但我需要运行很多查询 我知道主键是自动编制索引的——在我通常查询的主键中,单独编制一些列组的索引有什么好处吗 也就是说,如果我定期查询5个主键列中的前3个,我应该为这3个列创建一个额外的索引,还是因为它已经是主键索引的一部分而显得多余?为什么不创建一些测试查询,在表的副本上创建索引并查看它的执

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

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

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

我知道主键是自动编制索引的——在我通常查询的主键中,单独编制一些列组的索引有什么好处吗


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

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

说到绩效,衡量总是比相信一个意见好

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


也就是说,我的猜测是,如果子集包含查询中使用的所有列,那么子集上的索引将有所帮助。如果将结果集(select中的列)包含在索引中,您可能会获得更好的性能。

对于返回一行或少量行的查询来说,十秒钟是相当长的时间。但是,如果查询返回的是表内容的3%,那么10秒并不太长

主唯一键由复合索引备份,比如

  (I1,I2,I3,I4,I5)
这样的查询是正确的

  WHERE I1 = val AND I2 = val AND I3 = val
  WHERE I3 = val AND I4 = val AND I5 = val

应使用为主键创建的索引。重要的是,复合索引中的列都被使用,从最左边的一列开始。像这样的疑问

  WHERE I1 = val AND I2 = val AND I3 = val
  WHERE I3 = val AND I4 = val AND I5 = val
不会很好地使用主键的复合索引(如果有的话)。对键中提到的列值进行某种计算的查询也不会这样做,例如

  WHERE I1+I2+I3=sumvalue
请记住,“应该工作”和“确实工作”是不同的。试着在MySQL中使用EXPLAIN命令来判断DBMS是否在为您的查询执行您期望的操作


您的桌子是InnoDB还是MyISAMthanks Martijn,这是一个很好的建议。然而,我确实尝试过这样做,并没有得到结论性的结果,所以我想知道理论上是否应该有所不同。