标签: covering-index

Mysql覆盖vs复合vs列索引

在以下查询中

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
  AND   col4='value2'
Run Code Online (Sandbox Code Playgroud)

如果我在col3上有一个单独的索引,而在col4上有另一个索引,那么在这个查询中将使用哪一个?

我在某处读到,对于查询中的每个表,只使用一个索引.这是否意味着查询无法使用这两个索引?

其次,如果我同时使用col3col4创建了一个复合索引,但在WHERE子句中只使用了col3,那么性能会更差吗?例:

SELECT  col1,col2
FROM    table1
WHERE   col3='value1'
Run Code Online (Sandbox Code Playgroud)

最后,在所有情况下使用覆盖索引是否更好?MYISAM和innodb存储引擎有什么不同?

mysql sql indexing composite-index covering-index

36
推荐指数
2
解决办法
1万
查看次数

为什么在SQL索引中使用INCLUDE

我最近在我维护的数据库中遇到了一个索引:

CREATE INDEX [IX_Foo] ON [Foo]
( Id ASC )
INCLUDE 
( SubId )
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我遇到的性能问题(Id和SubId上的慢速SELECT过滤)可以通过简单地将SubId列移动到索引中而不是作为包含列来修复.

这让我想到了我根本不理解包含列的原因,一般来说,它们可能只是索引本身的一部分.即使我不特别关心索引本身的项目,在索引中使用列而不是简单地包含列也有任何缺点.

经过一些研究,我发现对索引列中的内容有很多限制(索引的最大宽度,以及一些不能像'image'那样索引的列类型).在这些情况下,我可以看到您将被迫在索引页数据中包含该列.

我唯一能想到的是,如果SubId上有更新,如果包含该列,则不需要重新定位该行(尽管索引中的值需要更改).还有别的东西让我失踪吗?

我正在考虑浏览数据库中的其他索引,并尽可能在索引中包含列.这会是一个错误吗?

我主要对MS SQL Server感兴趣,但也欢迎其他数据库引擎的信息.

sql sql-server indexing covering-index

14
推荐指数
2
解决办法
3196
查看次数

我可以在SQL Server 2008中创建"覆盖,空间"索引吗?

我目前有一个网站,其中包含一个具有Lat/Long浮点列的表,以及这两列的索引以及另一个我需要检索的列.

我一直在查询这个表,以获得从某一点落入半径范围内的行(我实际上得到了一个方形的速度),但我只需要已经编入索引的字段,所以这个索引实际上是覆盖的,执行计划只有两个步骤:

Index Seek  (cost: 100%) and SELECT (cost: 0%)
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试利用SQL 2008的空间功能.我创建了Geography列,填充它,创建空间索引,工作.

这一切都运行正常,除了执行计划有一百万步,并且74%的时间花在了Clustered Index Seek上,它将它在Spatial Index中找到的行连接到实际表,以获得其余的数据...
(空间索引寻求占执行计划成本的1%)

所以,显然,它是正确地使用Spatial索引并使用我的"常规"索引比Lat/Long更快地找到我需要的记录,但加入主表是杀了我,空间查询需要7倍作为只要我的旧的.

有没有办法在空间索引中添加更多的列,以便它可以覆盖它,它可以一步完成,就像以前一样?
还有其他方法可以改善这种情况吗?


更新:我发现"常规"索引可以使用INCLUDE关键字"包含"其他列(我不知道,我过去只在索引本身中包含列)
根据此处的文档,该子句不是空间索引的选项...任何想法?

谢谢!
丹尼尔

spatial sql-server-2008 spatial-index covering-index

7
推荐指数
1
解决办法
987
查看次数

为什么即使使用仅索引扫描,PostgresQL 计数也如此缓慢

我有一个简单的计数查询,可以使用仅索引扫描,但在 PostgresQL 中仍然需要很长时间!

我有一个cars包含 2 列的表,type bigint并且active boolean这些列上还有一个多列索引

CREATE TABLE cars
(
id BIGSERIAL NOT NULL
    CONSTRAINT cars_pkey PRIMARY KEY ,
type BIGINT NOT NULL ,
name VARCHAR(500) NOT NULL ,
active            BOOLEAN DEFAULT TRUE NOT NULL,
created_at        TIMESTAMP(0) WITH TIME ZONE default NOW(),
updated_at        TIMESTAMP(0) WITH TIME ZONE default NOW(),
deleted_at        TIMESTAMP(0) WITH TIME ZONE
);
CREATE INDEX cars_type_active_index ON cars(type, active);
Run Code Online (Sandbox Code Playgroud)

我插入了一些有 950k 条记录的测试数据,type=1 有 600k 条记录

INSERT INTO cars (type, name) …
Run Code Online (Sandbox Code Playgroud)

sql covering-index query-performance database-indexes postgresql-9.5

6
推荐指数
1
解决办法
1794
查看次数

复合非聚簇索引和覆盖索引之间有什么区别

SQL Server 2005包括"覆盖索引"功能,该功能允许我们选择多个非密钥列包含在现有的非聚簇索引中.

例如,我有以下列:

EmployeeID, DepartmentID, DesignationID, BranchID
Run Code Online (Sandbox Code Playgroud)

以下是两种情况:

  • EmployeeID是聚簇索引和剩余的列主键(DepartmentID,DesignationID, BranchID)被作为非聚集索引(复合索引).

  • EmployeeID是聚簇索引的主键和DepartmentID是与非聚集索引 DesignationID,BranchID属于"包括列"非聚集的索引.

上面两个有什么区别?如果两者都是相同的新引入"覆盖指数"概念?

sql-server indexing composite-index covering-index

5
推荐指数
1
解决办法
2916
查看次数

EF Code First:CreateIndex - 覆盖索引

是否可以使用EF Code First Migrations的CreateIndex语法来创建覆盖索引(*参见下面的覆盖索引).

例如,我可以在手动迁移中创建一个简单的索引,如下所示:

CreateIndex("RelatedProduct", "RelatedId");
Run Code Online (Sandbox Code Playgroud)

它有一个名为"匿名参数"的最终参数,它指定它可以处理底层提供者支持的任何东西 - 但是我不清楚我如何确定支持是什么.这是可能的还是我需要诉诸平面SQL?

*覆盖索引是RDB在叶节点中存储重复数据的索引,而不仅仅是指向主表的指针.它本质上是由索引中的列重新排序的表的重复,仅包含该类型搜索中最常用的列.

indexing entity-framework covering-index ef-code-first ef-migrations

3
推荐指数
1
解决办法
2176
查看次数

SQL Server中覆盖和单个索引的重叠

我有一个关于SQL Server(或任何RDBMS)索引的最佳实践的问题.请看下表:

ProfileID int
Text      nvarchar(50)
Run Code Online (Sandbox Code Playgroud)

ProfileID加入一张Profile桌子.每个配置文件都Text必须是唯一的.因此,我在两个列上都放置了一个主要封面键.精细.

但是,我也希望能够通过查询上表ProfileID.所以我也提了一个索引ProfileID.

这意味着我有一个重叠索引.我不知道这是否完全浪费,因为已经有一个封面索引,或者它是否正确,因为封面索引将是两列的散列(或者我是否误解了封面索引)?

编辑:

我按顺序创建了索引(ProfileID, Text).如果,为了论证的缘故,有3列A,B和C,它们都覆盖了所有3的覆盖索引.如果我们查询"A"或"A,B和C",它只会受益,但不会"B",或"C",或"B和C"?

sql-server indexing covering-index

3
推荐指数
1
解决办法
475
查看次数