database - 识别覆盖索引中不需要的列的方法有哪些?

标签 database performance indexing covering-index

有什么方法可以识别覆盖索引中的多余列:从不搜索的列,因此可以提取到 Includes 中,甚至完全删除而不影响索引的适用性?

最佳答案

澄清事情
覆盖索引 的想法是,它还包括可能无法搜索(在 WHERE 子句等中使用)但可能被选择(SELECT 的一部分)的列列列表)。

似乎没有任何简单的方法可以断言覆盖索引中未使用的列的存在。我只能想到下面一个艰苦的过程:

  • 在一段有代表性的时间段内,记录在服务器上(或在所需的表上)运行的所有查询
  • 过滤掉(通过正则表达式)不涉及基础表的查询
  • 对于剩余的查询,获取查询计划;丢弃不涉及相关索引的查询
  • 对于剩余的查询,或者更确切地说,对于查询的每个"template"(许多查询是相同的,但搜索条件值不同),从索引中列出在 select 或 where 子句(或在加入……)
  • 未在该列表中找到的索引列非常好。

现在,可能还有一些[要删除的列],因为上面的过程没有检查覆盖索引在哪个上下文中使用(它可能用于解析 where,但基础表仍然可以访问(例如,访问不在覆盖索引中的列...)

上述临床方法是相当没有吸引力的。 分析方法可能更可取:

查找可能在使用服务器的所有应用程序中使用的所有查询"template"。对于这些模式中的每一个,找到可能使用覆盖索引的模式。这些是(又是一些漏洞......)查询:

  • 包括对基础表的引用
  • 不要以任何方式引用基础表中不是索引中列的列
  • 不要使用比索引列更具选择性的基础表的搜索条件(按它们的顺序......)

或者......甚至不去应用程序:考虑所有用例,如果服务于这些用例的查询将受益于索引中的所有列。这样做意味着您对索引的选择性相对较好地了解了它的前几列。

关于database - 识别覆盖索引中不需要的列的方法有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1545661/

相关文章:

sql-server - Weka如何连接到MSSQL服务器

database - 在数据库中存储营业时间

android - 如何在 uiautomator 测试用例中获取上下文?

sql - Dateadd 如何影响 SQL 查询的性能?

ios - 核心数据中部分索引的整个字母表

mysql - 多列索引与多索引

mysql - 我如何编写一个 SQL 查询来检查列是否为零,它将更新它,如果不是,它将移动到下一列?

matlab - 在循环中创建结构体的最佳方法是什么?

java - 如何查看Java进程中所有线程的所有上下文切换的总和?

php - 在 MySQL 中使用 LIKE 子句优化表以进行搜索