3

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

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

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

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

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

4

2 回答 2

3

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

您的主唯一键由复合索引备份,假设索引

  (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

于 2012-06-18T13:16:35.020 回答
0

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

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

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

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

于 2012-06-18T07:04:55.453 回答