热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AB上的索引是否多余如果ABC上有索引?-IsanindexonA,BredundantifthereisanindexonA,B,C?

HavingyearsofexperienceasaDBA,IdobelieveIknowtheanswertothequestion,butIfiguredi

Having years of experience as a DBA, I do believe I know the answer to the question, but I figured it never hurts to check my bases.

作为一名DBA,我有多年的工作经验,我相信我知道这个问题的答案,但我认为检查自己的底细没有坏处。

Using SQL Server, assuming I have a table which has an index on column A and column B, and a second index on columns A, B, and C, would it be safe to drop the first index, as the second index basically would satisfy queries that would benefit from the first index?

使用SQL Server,假设我有一个表的索引列和列B,和第二个索引列a,B和C,可以安全删除第一个索引,第二个指数基本上可以满足查询,将受益于第一个索引?

5 个解决方案

#1


28  

It depends, but the answer is often 'Yes, you could drop the index on (A,B)'.

这要看情况,但答案通常是“是的,你可以在(A,B)上删除索引”。

The counter-case (where you would not drop the index on (A,B)) is when the index on (A,B) is a unique index that is enforcing a constraint; then you do not want to drop the index on (A,B). The index on (A,B,C) could also be unique, but the uniqueness is redundant because the (A,B) combination is unique because of the other index.

反例(在A,B上不放索引)是当(A,B)上的索引是一个唯一的索引来执行约束;那么你就不想把索引放在(A,B)上。(A、B、C)上的索引也可能是惟一的,但是惟一性是多余的,因为(A、B)组合由于其他索引而惟一。

But in the absence of such unusual cases (for example, if both (A,B) and (A,B,C) allow duplicate entries), then the (A,B) index is logically redundant. However, if the column C is 'wide' (a CHAR(100) column perhaps), whereas A and B are small (say INTEGER), then the (A,B) index is more efficient than the (A,B,C) index because you can get more information read per page of the (A,B) index. So, even though (A,B) is redundant, it may be worth keeping. You also need to consider the volatility of the table; if the table seldom changes, the extra indexes don't matter much; if the table changes a lot, extra indexes slow up modifications to the table. Whether that's significant is difficult to guess; you probably need to do the performance measurements.

但是如果没有这种不寻常的情况(例如,如果(A、B)和(A、B、C)都允许重复条目),那么(A、B)索引在逻辑上是冗余的。但是,如果列C是“宽”(可能是CHAR(100)列),而a和B是小的(比如整数),那么(a,B)索引比(a,B,C)索引更有效,因为您可以从(a,B)索引的每一页中获得更多的信息。所以,即使(A,B)是冗余的,它也值得保留。您还需要考虑表的波动性;如果表很少更改,那么额外的索引并不重要;如果表变化很大,那么额外的索引会减慢对表的修改。这是否具有重大意义还难以猜测;您可能需要进行性能度量。

#2


11  

The first index covers queries that look up on A , A,B and the second index can be used to cover queries that look up on A , A,B or A,B,C which is clearly a superset of the first case.

第一个索引包含查找A、A、B的查询,第二个索引可以用于查询查找A、A、B或A、B、C的查询,这显然是第一种情况的超集。

If C is very wide however the index on A,B may still be useful as it can satisfy certain queries with fewer reads.

如果C非常宽,但是A上的索引,B可能仍然有用,因为它可以用更少的读取来满足某些查询。

e.g. if C was a char(800) column the following query may benefit significantly from having the narrower index available.

例如,如果C是一个char(800)列,下面的查询可以从更窄的索引中获益良多。

SELECT a,b
FROM YourTable
ORDER BY a,b

#3


7  

Yes, this is a common optimization. Any query that would benefit from the index on A,B can also benefit just as well from the index on A,B,C.

是的,这是一个常见的优化。从A、B上的索引中获益的任何查询也可以从A、B、C上的索引中获益。

In the MySQL community, there's even a tool to search your whole schema for redundant indexes: http://www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html

在MySQL社区中,甚至有一个工具可以搜索整个模式中的冗余索引:http://www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html

The possible exception case would be if the index on A,B were more compact and used much more frequently, and you wanted to control which index was kept loaded in memory.

可能的例外情况是,如果A、B上的索引更紧凑,使用频率更高,并且希望控制哪些索引被保存在内存中。

#4


4  

Much of what I was thinking was written by Jonathan in previous answer. Uniqueness, faster work, and one other thing I think he missed.

我想的大部分内容都是乔纳森之前的回答。独特性,更快的工作,还有一件事我认为他漏掉了。

If the first index is made A desc, B asc and second A asc, B asc, C asc, then deleting he first index isn't really a way to go, because the second one isn't a superset of the first one, and your query cannot benefit from the second index if ordering is as written in the first one.

desc,如果第一个索引B asc和第二asc,asc B,C asc,然后删除他第一次指数并不是一个真正的路要走,因为第二个不是第一个的超集,而且查询不能受益于第二索引排序是否写在第一个。

In some cases like when you use the first index, you can order by A desc, B asc (of course) and A asc, B desc, but you can also make a query that will use any part of that index, like Order by A desc.

在某些情况下,如使用第一个索引时,可以使用desc、B asc(当然)和A asc、B desc,但也可以使用该索引的任何部分进行查询,比如使用desc的order。

But a query like order by A asc, B asc, will not be 'covered' by the first index.

但是asc、B asc的order这样的查询不会被第一个索引“覆盖”。

So I would add up, you can usually delete the first index, but that depends on your table configuration and your query (and, of course, indexes).

所以我想说的是,您通常可以删除第一个索引,但是这取决于您的表配置和查询(当然还有索引)。

#5


2  

I typically would find this "almost" similar index in table that contains historical data. If column C is a date or integer column, be careful. It is most likely used to satisfy the MAX function as in WHERE tblA.C = MAX(tblB.C), which skips the table altogether and utilize an index only access path.

我通常会在包含历史数据的表中找到这个“几乎”相似的索引。如果C列是日期或整数列,请小心。它很可能被用来满足最大函数,就像tblA。C = MAX(tblB.C),它完全跳过表,只使用索引访问路径。


推荐阅读
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在PHP中,高效地分割字符串是一项常见的需求。本文探讨了多种技术,用于在特定字符(如“或”)后进行字符串分割。通过使用正则表达式和内置函数,可以实现更加灵活和高效的字符串处理。例如,可以使用 `preg_split` 函数来实现这一目标,该函数允许指定复杂的分隔符模式,从而提高代码的可读性和性能。此外,文章还介绍了如何优化分割操作以减少内存消耗和提高执行速度。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • HTML 页面中调用 JavaScript 函数生成随机数值并自动展示
    在HTML页面中,通过调用JavaScript函数生成随机数值,并将其自动展示在页面上。具体实现包括构建HTML页面结构,定义JavaScript函数以生成随机数,以及在页面加载时自动调用该函数并将结果呈现给用户。 ... [详细]
  • 在TypeScript中,我定义了一个名为 `Employee` 的接口,其中包含 `id` 和 `name` 属性。为了使这些属性可选为空,可以通过使用 `| null` 或 `| undefined` 来扩展其类型定义。例如,`id: number | null` 表示 `id` 可以是数字或空值。这种类型的灵活性在处理不确定的数据时非常有用,可以提高代码的健壮性和可维护性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
author-avatar
我也不走了_931_327
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有