【问题标题】:Single column/multiple column index, what is better?单列/多列索引,哪个更好?
【发布时间】:2011-09-16 10:51:03
【问题描述】:

我有一个执行不佳的过程,其中包含几个查询。

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

数据库是 DB2

【问题讨论】:

  • 最好把你的程序贴出来。

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


【解决方案1】:

这在很大程度上取决于您的查询和表中的数据。根据经验,您应该只包括大大减少结果行的列。

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

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

【讨论】:

    【解决方案2】:

    如果 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 子句中使用索引顺序(从左到右)中提到的列,那么它比单列索引更好

    【讨论】:

      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      • 2018-07-27
      • 2020-05-06
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多