组合的多列索引以及多个单列索引

阿卡什·卡瓦(Akash Kava)

我想知道在以下情况下一起定义两种类型的索引有什么害处。

Tasks

  TaskID (Primary, Auto Number)
  OwnerID (Single Column Index)
  AssignedToID (Single Column Index)
  DateUpdated (Single Column Index)
  TaskStatus (Single Column Index)

  Mutli Column Index (AssignedToID, DateUpdated)

有以下主要查询... to的查询DateUpdated是可选的。

  • 管理员可以按日期过滤任务
  • 访问单列索引DateUpdated

    WHERE 
        DateUpdated <= startDate 
        AND DateUpdated <= endDate
    ORDER BY
        DateUpdated DESC
    
  • 访问单列索引DateUpdated

    WHERE
         TaskStatus = 'Active' 
    ORDER BY
         DateUpdated DESC
    
  • 用户可以过滤仅分配给他们的任务

  • 访问多列索引

    WHERE 
        DateUpdated <= startDate 
        AND DateUpdated <= endDate
        AND AssignedToID = userID
    ORDER BY
        DateUpdated DESC
    
  • 访问多列索引

    WHERE 
         AssignedToID = userID
         AND TaskStatus = 'Active'
    ORDER BY
         DateUpdated DESC
    
  • DateUpdated 在任何标准中均未引用

  • TaskID访问单列索引

    WHERE 
        AssignedToID = userID
        AND TaskStatus = 'Active'
    ORDER BY
        TaskID DESC
    

看起来我可以通过在某些常见查询中定义多列索引来提高性能,但我有以下问题。

  1. 定义组合索引和多个索引是否有害?
  2. 如果查询包含每一列的谓词,而不管查询中列的顺序如何,SQL是否会优先考虑合并索引而不是单索引合并?
  3. 如果您有关于两个索引都可能有害的示例,那么我想学习为什么和如何做,以便我可以相应地设计索引。

我的数据库操作是95%的读取和5%的写入,因此我不太担心索引写入性能问题,但是我的读取性能是最重要的。

螺旋

定义组合索引和多个索引是否有害?

我宁愿称其为维护开销,而不是伤害:
-对于每个新索引,此表上的INSERT / UPDATE / DELETE会慢一些。
-索引占用一些磁盘空间。

如果查询包含每一列的谓词,而不管查询中列的顺序如何,SQL是否会优先考虑合并索引而不是单索引合并?

查询中列的顺序无关紧要。

索引中列的顺序很重要。
所以:
在指数(AssignedToIDDateUpdated)可用于寻找,而不是在(指数AssignedToID),但
在指数(DateUpdatedAssignedToID)不能用于寻求替代指数的(AssignedToID)。

查询优化器将根据估计的成本选择要使用的索引,并根据统计信息(表/索引中有多少行以及值的分布方式)计算出该索引。
它可能决定根本不使用索引-如果行数少并且扫描整个表便宜,或者索引不够选择性。

如果查询包含onAssignedToIDDateUpdated-上的谓词AssignedToIDDateUpdated则查询优化器比(AssignedToID上的索引更可能使用(上的索引
但是,它取决于查询的所有其他元素以及数据库中的实际数据。

如果您有关于两个索引都可能有害的示例,那么我想学习为什么和如何做,以便我可以相应地设计索引。

当数据库或/和请求的数量显着增长时,开销可能变得很明显。

有关“索引过多”的更多信息
一般索引准则


根据您的主要查询,看起来非聚集索引应该是:

  • DateUpdated
  • AssignedToIDDateUpdated

可能是:

  • TaskStatus)-但是,如果说有90%的任务是'Active'您只查询'Active'-那就没有用了。

并不需要:

  • AssignedToID)-因为(AssignedToIDDateUpdated)索引就足够了。

之后,您可以在测试数据库上验证假设,并且数据与生产足够接近。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Oracle多列索引与单列索引

来自分类Dev

Oracle:单个多列索引或两个单列索引

来自分类Dev

SQL在表上创建多列索引和单列索引

来自分类Dev

.map函数的索引以及内部方法

来自分类Dev

多列索引对单列也有用吗?

来自分类Dev

F#deedle框架,如何获取行索引和列索引以及每列的数据类型

来自分类Dev

在数据框上创建多索引以执行PanelOLS

来自分类Dev

根据提供的列索引将多列xts减少为单列xts

来自分类Dev

通过函数建立索引以收集多个值

来自分类Dev

索引多列

来自分类Dev

SQL多列索引

来自分类Dev

索引多列

来自分类Dev

索引并匹配多列

来自分类Dev

子集多索引列

来自分类Dev

熊猫分组索引以使用各自的值分隔列

来自分类Dev

在多索引熊猫数据框中创建多个新列

来自分类Dev

根据索引或列组合行

来自分类Dev

将多索引索引转换为列

来自分类Dev

从多索引到单索引堆叠列

来自分类Dev

熊猫TimerGrouper:索引以开头

来自分类Dev

整理索引以访问元素?

来自分类Dev

如何将多列单列列表组合成多列单列列表?

来自分类Dev

矩阵中恒定连续值的索引以及恒定值的数量

来自分类Dev

使用开始和结束索引以及单个where子句从Firebase数据库检索数组

来自分类Dev

在字符串中查找不同的字符并保存其索引以及它们的更改方式

来自分类Dev

矩阵中恒定连续值的索引以及恒定值的数量

来自分类Dev

numpy 三维切片和索引以及省略号是如何工作的?

来自分类Dev

为什么 MySql 不使用我的索引以及如何避免“使用临时;使用文件排序”?

来自分类Dev

Oracle:可以用唯一的组合索引替换标准的非唯一单列索引吗?

Related 相关文章

热门标签

归档