ON 子句和 INCLUDE 子句中指定列的索引声明差异

Posted

技术标签:

【中文标题】ON 子句和 INCLUDE 子句中指定列的索引声明差异【英文标题】:Difference in index declaration between specifying columns in ON clause and in INCLUDE clause 【发布时间】:2020-02-19 18:49:52 【问题描述】:

只是想知道索引。这对我来说是一个相当新的概念,我看不出在 ON 子句和 INCLUDE 子句中声明列之间的区别。下面的例子应该可以解释这个问题:

CREATE INDEX ix_client_info1
ON dbo.client(name, age, city)
WHERE name = 'A%';

CREATE INDEX ix_client_info2
ON dbo.client(name)
INCLUDE(age, city)
WHERE name = 'A%';

这两个索引的行为有何不同?在什么情况下使用哪个?

【问题讨论】:

更多阅读请见covering index。 【参考方案1】:

不同的是included列在索引中没有排序;它们不属于索引树,它们只是添加到叶子中。

所以这基本上意味着两件事:

索引有点小,维护它的开销也更少

如果包含的列用于过滤(如在连接的where 子句、on 子句或group by 子句中)或用于排序(如在order by 子句);仅当列仅在 select 子句中使用时才有用,因此当您需要 覆盖 索引时,这很方便)

包含列有用的情况并不多,除非您正在进行高级优化。通常,您需要常规列键。

【讨论】:

谢谢。对于未来的寻求者,这里有更多关于这个话题的信息:***.com/questions/1307990/…

以上是关于ON 子句和 INCLUDE 子句中指定列的索引声明差异的主要内容,如果未能解决你的问题,请参考以下文章

索引 创建原则

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

SqlSever基础 查看一个数据库中的一个表中指定列的内容

WHERE 后跟 ON 子句

如何用Jquery获取Table指定行中指定列的数值

如果在 ON 子句中使用 OR,MySQL 将不会在 JOIN 中使用可用索引