Database 单列/多列索引,什么更好?
我有一个执行得很差的过程,其中有几个查询 我已经确定了几个扫描临时表的临时表查询。我决定在临时表上添加索引以避免表扫描。我注意到在where子句中使用了temp表的多个列。但是,我不确定是应该在单个索引(复合索引)中包含所有列,还是在每个索引中包含一列的多个索引以获得最大性能Database 单列/多列索引,什么更好?,database,db2,query-optimization,indexing,database-indexes,Database,Db2,Query Optimization,Indexing,Database Indexes,我有一个执行得很差的过程,其中有几个查询 我已经确定了几个扫描临时表的临时表查询。我决定在临时表上添加索引以避免表扫描。我注意到在where子句中使用了temp表的多个列。但是,我不确定是应该在单个索引(复合索引)中包含所有列,还是在每个索引中包含一列的多个索引以获得最大性能 数据库是DB2,这在很大程度上取决于您的查询和表中的数据。根据经验,您应该只包含大大减少结果行的列 例如,如果第一个限制列的where子句已经删除了90%的行,而下一个限制列只会减少几百行,那么索引中包含的资源就不值得了。
数据库是DB2,这在很大程度上取决于您的查询和表中的数据。根据经验,您应该只包含大大减少结果行的列 例如,如果第一个限制列的where子句已经删除了90%的行,而下一个限制列只会减少几百行,那么索引中包含的资源就不值得了。请始终记住,数据库引擎首先处理复合索引的第一列,然后处理下一列。如果您的查询中列的顺序不同,索引可能会开始减慢查询速度
此外,如果您有大量数据,并且使用多个索引列似乎是值得的,那么在某些情况下,您可能希望使用单独的索引并进行内部并行工作。如果您的服务器有空闲的话,使用多个CPU运行并行索引查找可能会有更好的性能。对于MySQL,可以使用多个列索引进行查询,以测试索引中的所有列,或者只测试第一列、前两列、前三列等等 如果在索引定义中按正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询 假设您已经在test表上创建了
索引名idx(姓、名)
因此,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');
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
其中as namenameIdx不用于以下查询中的查找:
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');
SELECT * FROM test WHERE first_name='Michael';
SELECT * FROM test
WHERE last_name='Widenius' OR first_name='Michael';
有关更多详细信息,请参阅
总结一下,如果您在where子句中使用了索引顺序(从左到右)中提到的列,那么它比单列索引更好,最好发布您的过程。