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

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

我有一个包含6个数字列的表.其中的前5个组成主键.

它是一个大表(2000万行,并且正在增长),因此一些查询需要花费时间-大约10秒,这本身并不算太长,但是我需要运行很多查询.

我知道主键是自动索引的-我单独索引通常查询的主键中的某些列组有什么好处吗?

也就是说,如果我定期查询5个主键列中的前3个,是否应该为这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

上一篇:mysql-外键和索引


下一篇:vb.net之窗体继承