Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 单列/多列索引,什么更好?_Database_Db2_Query Optimization_Indexing_Database Indexes - Fatal编程技术网

Database 单列/多列索引,什么更好?

Database 单列/多列索引,什么更好?,database,db2,query-optimization,indexing,database-indexes,Database,Db2,Query Optimization,Indexing,Database Indexes,我有一个执行得很差的过程,其中有几个查询 我已经确定了几个扫描临时表的临时表查询。我决定在临时表上添加索引以避免表扫描。我注意到在where子句中使用了temp表的多个列。但是,我不确定是应该在单个索引(复合索引)中包含所有列,还是在每个索引中包含一列的多个索引以获得最大性能 数据库是DB2,这在很大程度上取决于您的查询和表中的数据。根据经验,您应该只包含大大减少结果行的列 例如,如果第一个限制列的where子句已经删除了90%的行,而下一个限制列只会减少几百行,那么索引中包含的资源就不值得了。

我有一个执行得很差的过程,其中有几个查询

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


数据库是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子句中使用了索引顺序(从左到右)中提到的列,那么它比单列索引更好,最好发布您的过程。