我正在使用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