我应该索引已经属于多字段索引的字段吗?

时间:2010-07-04 20:32:26

标签: mysql indexing

比方说,我有一个这样的表,前三个字段有一个主键:

itemid | type | value | other_field [etc]

如果在我的网页上我几乎总是只选择type字段,那么type上的单独的索引是值得的(即性能会提高),或主键索引是否覆盖了该字段?

2 个答案:

答案 0 :(得分:4)

索引/键中字段的顺序很重要。

如果你的主键是打开的(type,itemid,value)或(type,value,itemid),那么额外的索引可能没什么区别。多列的索引也可以用于该索引的任何完整前缀。在这种情况下创建新索引的一个优点是稍微窄一些,因此每页上会有更多行,但这种差异可能很小。此外,您应该考虑查询的好处,以及修改数据的额外成本。

如果您的主键是其他任何内容,例如(itemid,type,value),那么(type)上的额外索引可能会有所帮助,因为当type不是第一个时,主键不能用作类型的索引列表。

关于过早优化的常见评论也在这里举行。确定最快速度的最佳方法是在实际数据上自行测试。在某些情况下,即使您认为索引应该是,也不会使用索引,或者有时使用索引而不是您认为的索引。如果您想提高应用程序的性能,您应该收集(或随机生成,如果这不是一个选项)一些实际数量的数据,并使用不同的索引策略衡量您对这些数据的查询的实际性能。

答案 1 :(得分:1)

这取决于主键中列出的字段的顺序。

它还取决于您对表格的查询。

如果主键按此顺序打开'(item,type,value)',则表示仅在'type'上的条件的查询无法充分利用主键索引。在这种情况下,“类型”或“(类型,......)”上的单独索引可能有一定意义;它可能会被查询使用。但是,如果您从不进行任何仅列出类型的查询(它们总是列出项目和类型),那么额外的索引不太可能有用。

在不知道(a)表中已存在的索引和(b)对表运行得太慢的查询类型的情况下,尝试决定是否向表添加索引是愚蠢的。如果没有任何查询太慢,您可能不需要索引。