0

我看到了描述覆盖索引的文档:

覆盖索引包含查询检索到的所有列
的索引。

这是否意味着覆盖索引是一个特定的索引?

我认为覆盖指数是一种现象。

如果我按照文档的描述,那么请看下面的sql语句:

create index idx_name_age on table(id, name)
select id, name from table where id = 1
select id, name, age from table where id = 1

idx_name_age是第一个语句中的覆盖索引,第二个不是。

所以我认为:覆盖指数是一种现象而不是指数

4

2 回答 2

2

假设“覆盖”是“一个INDEX对于特定SELECT.

一些例子:

select id, name from table where id = 1

    INDEX(id, name)       -- covering; best index
    INDEX(id, name, age)  -- covering, but overkill
    INDEX(age, name, id)  -- covering, but inefficient (might not be used)

select id, name, age from table where id = 1

    INDEX(id, name, age) -- Having `id` first is optimal, but any order is "covering"

正如已经指出的,如果这是 InnoDB 并且表有PRIMARY KEY(id),那么这些二级索引都不值得拥有。

SELECT a FROM tbl GROUP BY b ORDER BY c

    No index is very useful since the GROUP BY and ORDER BY are not the same.
    INDEX(a,b,c)   -- in any order, is "covering"
    INDEX(b,c,a)   -- "covering", and perhaps optimal.
    INDEX(b,c,a,d) -- "covering", but 'bigger'

大事以小事为重。这样做时SELECT COUNT(*) FROM ...,InnoDB 将(通常)选择“最小”索引来进行计数。

另一个“规则”是避免冗余索引。

    INDEX(a,b)  -- Let's say you 'need' this one.
    INDEX(a)    -- Then this one is redundant and should be dropped.
于 2019-08-22T15:39:17.703 回答
0

覆盖指数是具体指数吗?

的,它是一个专门为满足特定查询而设计的索引。

对于这个查询

select id, name, age from table where id = 1

覆盖索引是(id, name, age)由创建的多列索引

create index idx_name_age on table(id, name, age)

怎么会这样?

id是索引中的第一列,因为它用于WHERE id = 1. 首先是因为 MySQL 索引通常是 BTREE,按索引顺序随机访问。因此WHERE id = 1可以在索引中跳转以查找这些id值。

name并且age也出现在索引中,因为它们出现在SELECT子句中。因为它们在索引中,所以查询可以完全从索引中得到满足。这很好,因为它减少了从磁盘或 ssd 的读取:MySQL 在满足查询之前不必使用索引来查找主表中的行。

(id, name)上的索引不是上述查询的覆盖索引;该age列丢失。

这个查询

select id, name from table where id = 1

也可以通过 (id, name, age)覆盖索引来满足。它也可以通过(id, name):上的索引来满足,这第二个查询(但不是第一个查询)的覆盖索引。

您的示例说明了词汇表的定义。索引通过使用额外的磁盘/ssd 空间来存储数据来提高查询性能。

Microsoft SQL Server 用户可以像这样声明索引:

create index idx_name_age on table (id) include (name, age)

在此索引中, 的值name和 与索引中的age一起使用id,但索引未按包含的列排序。因此,更新索引需要更少的时间。

如果id是表的主键,则在 MySQL 的 InnoDB 或 SQL Server 中都不适用。表本身是一个索引id;它有时被称为聚集索引。但现在我们进入了太多细节。

如果使用得当,覆盖索引可以显着提高查询性能。阅读https://use-the-index-luke.com/ 要获得帮助的索引,您必须设计它们以匹配您的查询。这是数据库优化艺术的很大一部分。

于 2019-08-22T10:17:31.317 回答