我有一个性能很差的过程,里面有几个查询。
我发现了几个执行临时表扫描的临时表查询。我决定在临时表上添加索引,以避免表扫描。我注意到where子句中使用了临时表的多个列。但是,我不确定是应该在单个索引(复合索引)中包含所有列,还是应该在每个索引中包含一列的多个索引,以获得最大的性能。
数据库为DB2
发布于 2011-09-18 05:00:06
这在很大程度上取决于您的查询和表中的数据。根据经验,您应该只包含那些极大地减少了结果行的列。
如果第一个限制列的where子句已经删除了90%的行,而下一列只会减少几百行,那么将不值得将资源包含在索引中。请始终记住,数据库引擎首先处理复合索引的第一列,然后再处理下一列。如果您的查询具有不同顺序的列,则索引可能会开始甚至减慢您的查询速度。
此外,如果您有大量数据,并且使用多个索引列似乎是值得的,那么在某些情况下,您可能希望使用单独的索引并进行内部并行工作。使用多个CPU运行并行索引查找可能会有更好的性能--如果您的服务器需要空闲的话。
发布于 2014-04-16 15:12:07
在MySQL的情况下,可以将多列索引用于测试索引中所有列的查询,或者只测试第一列、前两列、前三列等的查询。
如果在索引定义中以正确的顺序指定列,则单个复合索引可以加快对同一个表执行多种查询的速度。
假设您在表test上创建了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');
其中,as名称nameIdx不用于以下查询中的查找:
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
有关更多详细信息,请参阅URL
总结一下,如果按照索引顺序(从左到右)在where子句中使用列,那么它比单列索引更好
https://stackoverflow.com/questions/6373697
复制相似问题