单列/多列索引,哪个更好?

时间:2011-06-16 14:36:41

标签: database db2 query-optimization indexing database-indexes

我有一个表现不佳的程序,里面有几个查询。

我已经确定了几个临时表查询,它们会扫描临时表。我决定在临时表上添加索引以避免表扫描。我注意到有多个临时表列在where子句中使用。但是,我不确定是否应将所有列都包含在单个索引(复合索引)或多个索引中,每个索引都有一列,以获得最大性能。

数据库是DB2

2 个答案:

答案 0 :(得分:0)

这完全取决于您的查询和桌面上的数据。根据经验,您应该只包括大大减少结果行的列。

如果第一个限制列的where子句已经丢弃了例如90%的行,而下一个列只会减少几百行,则不值得将资源包含在索引中。始终记住,数据库引擎首先使用复合索引的第一列,然后继续执行下一个。如果您的查询具有不同顺序的列,则索引可能会启动,甚至会降低查询速度。

此外,如果您有大量数据并且使用多个索引列似乎值得,您可能在某些情况下希望拥有单独的索引并具有内部并行功能。使用多个CPU运行并行索引查找可能具有更好的性能 - 如果您的服务器必须备用。

答案 1 :(得分:0)

如果MySQL可以对测试索引中所有列的查询使用多列索引,或者只测试第一列,前两列,前三列等的查询。

如果在索引定义中以正确的顺序指定列,则单个复合索引可以加速同一个表上的多种查询。

假设您在表格测试中创建了INDEX nameIdx (last_name,first_name)

因此, nameIdx 索引用于以下查询中的查找:

SELECT * FROM test WHERE last_name='Widenius';

SELECT * FROM test
  WHERE last_name='Widenius' AND first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius'
  AND (first_name='Michael' OR first_name='Monty');

在以下查询中,名称 nameIdx 不用于查找:

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test
  WHERE last_name='Widenius' OR first_name='Michael';

有关详细信息,请参阅URL

总结一下,如果你在索引顺序中提到的where子句中使用列(从左到右)那么它比单列索引更好