在以下查询中
SELECT col1,col2
FROM table1
WHERE col3='value1'
AND col4='value2'
Run Code Online (Sandbox Code Playgroud)
如果我在col3上有一个单独的索引,而在col4上有另一个索引,那么在这个查询中将使用哪一个?
我在某处读到,对于查询中的每个表,只使用一个索引.这是否意味着查询无法使用这两个索引?
其次,如果我同时使用col3和col4创建了一个复合索引,但在WHERE子句中只使用了col3,那么性能会更差吗?例:
SELECT col1,col2
FROM table1
WHERE col3='value1'
Run Code Online (Sandbox Code Playgroud)
最后,在所有情况下使用覆盖索引是否更好?MYISAM和innodb存储引擎有什么不同?
我最近在我维护的数据库中遇到了一个索引:
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感兴趣,但也欢迎其他数据库引擎的信息.
我目前有一个网站,其中包含一个具有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关键字"包含"其他列(我不知道,我过去只在索引本身中包含列)
根据此处的文档,该子句不是空间索引的选项...任何想法?
谢谢!
丹尼尔
我有一个简单的计数查询,可以使用仅索引扫描,但在 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
SQL Server 2005包括"覆盖索引"功能,该功能允许我们选择多个非密钥列包含在现有的非聚簇索引中.
例如,我有以下列:
EmployeeID, DepartmentID, DesignationID, BranchID
Run Code Online (Sandbox Code Playgroud)
以下是两种情况:
EmployeeID是聚簇索引和剩余的列主键(DepartmentID,DesignationID,
BranchID)被作为非聚集索引(复合索引).
EmployeeID是聚簇索引的主键和DepartmentID是与非聚集索引
DesignationID,BranchID属于"包括列"非聚集的索引.
上面两个有什么区别?如果两者都是相同的新引入"覆盖指数"概念?
是否可以使用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
我有一个关于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"?