Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是MySQL覆盖索引?_Mysql_Indexing_Query Performance_Covering Index - Fatal编程技术网

什么是MySQL覆盖索引?

什么是MySQL覆盖索引?,mysql,indexing,query-performance,covering-index,Mysql,Indexing,Query Performance,Covering Index,我看到了描述覆盖率的索引: 覆盖指数 包含查询检索到的所有列的索引 这是否意味着覆盖指数是一个特定的指数 我认为覆盖指数是一种现象。 如果我遵循文档的描述,请参见以下sql语句: 在表(id,name)上创建索引idx\u name\u age 从id=1的表中选择id、名称 从id=1的表中选择id、名称、年龄 idx\u name\u age是第一条语句中的覆盖索引,第二条语句不是 因此我认为:覆盖指数是一种现象,而不是一种指数 覆盖指数是一个具体的指数吗 是,它是专门为满足特定查询而设计

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

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

这是否意味着覆盖指数是一个特定的指数

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

如果我遵循文档的描述,请参见以下sql语句:

在表(id,name)上创建索引idx\u name\u age
从id=1的表中选择id、名称
从id=1的表中选择id、名称、年龄
idx\u name\u age
是第一条语句中的覆盖索引,第二条语句不是

因此我认为:覆盖指数是一种现象,而不是一种指数

覆盖指数是一个具体的指数吗

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

对于此查询

select id, name, age from table where id = 1
覆盖索引是由创建的
(id、姓名、年龄)
上的多列索引

create index idx_name_age on table(id, name, age)
怎么会这样

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

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

(id,name)
上的索引不是上述查询的覆盖索引;缺少
age

这个问题

select id, name from table where id = 1
也可以从(
id、姓名、年龄)
覆盖索引中得到满足。它还可以通过
(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
上的索引;它有时被称为聚集索引。但现在我们讨论的细节太多了

如果使用得当,覆盖索引可以显著提高查询性能。要获得索引帮助,必须将其设计为与查询匹配。这是数据库优化艺术的很大一部分

覆盖指数是一个具体的指数吗

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

对于此查询

select id, name, age from table where id = 1
覆盖索引是由创建的
(id、姓名、年龄)
上的多列索引

create index idx_name_age on table(id, name, age)
怎么会这样

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

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

(id,name)
上的索引不是上述查询的覆盖索引;缺少
age

这个问题

select id, name from table where id = 1
也可以从(
id、姓名、年龄)
覆盖索引中得到满足。它还可以通过
(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
上的索引;它有时被称为聚集索引。但现在我们讨论的细节太多了

如果使用得当,覆盖索引可以显著提高查询性能。要获得索引帮助,必须将其设计为与查询匹配。这是数据库优化技术的一大部分。

假设“覆盖”是“相对于特定
选择的索引属性”

一些例子:

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,并且表具有
主键(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'
大的事情在小的方面。当从…
中选择计数(*)时,InnoDB(通常)会选择“最小”的索引进行计数

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

    INDEX(a,b)  -- Let's say you 'need' this one.
    INDEX(a)    -- Then this one is redundant and should be dropped.
假设“覆盖”是“相对于特定
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,并且表具有
主键(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'
大事化小。什么时候