仅选择索引属性会导致更快的查询吗?

时间:2009-03-26 20:07:32

标签: database database-design

在执行查询时,所选属性构成索引的组件会导致更快的查询吗?我想,查询规划器/优化器可以看到索引扫描可以完全满足所请求的列。

琐碎的例子

CREATE TABLE "liked" (
  "id" BIGINT NOT NULL DEFAULT nextval('liked_id_seq'),
  "userid" BIGINT NOT NULL,
  "storyid" BIGINT NOT NULL,
  "notes" TEXT,
  PRIMARY KEY ("id")
);
CREATE INDEX "liked_user" ON "liked" (
  "userid",
  "storyid"
);
ALTER TABLE "liked" ADD FOREIGN KEY ("userid") REFERENCES "users" ("id") ON DELETE CASCADE;
ALTER TABLE "liked" ADD FOREIGN KEY ("storyid") REFERENCES "story" ("id") ON DELETE CASCADE;


SELECT storyid from liked where userid = 1;

通过上面的查询,liked_user索引中已包含的内容之外没有任何数据,因此我认为如果查询优化器可以推断出结果元组可以满足,则会有更少的操作仅指数。

4 个答案:

答案 0 :(得分:3)

它被称为“覆盖索引”,它可以通过根据您使用的DBMS(以及使用MySQL,哪种存储风格)改变数量来提高效率。

尝试举例说明具体情况,如果有的话。

答案 1 :(得分:1)

一般情况下,是的,但这取决于您如何访问它们。使用LIKE来锁定字符串字段中间的匹配对于索引来说不会更快。

答案 2 :(得分:1)

根据我的经验,不是那么多。您可以通过优化条件来加速查询,并尝试在这些条件下使用最佳索引。有很多方法可以根据您选择的内容减慢查询速度,例如使用子查询,也许还有一些UDF - 当然,您可以使用一些不太理想的连接来减慢查询速度。

答案 3 :(得分:1)

它可以,但有一些警告。这些评论基于Oracle,btw。

例如,SELECT COL1 FROM MY_TABLE可能能够使用索引,但如果索引的所有列都可以为空,那么可能会有常规btree索引中不包含的行,因此可能不会使用索引。

索引也可能比基础表更大(因此更难以进行全面扫描)(例如,表只有一列),因为索引必须包含每个条目的rowid作为列值。在这种情况下,除非查询可以以某种特殊方式利用索引信息(例如,您包含索引可以提供的ORDER BY子句而无需排序),否则可能不会使用索引。

您还应该研究RDBMS可以使用的各种索引访问方法,以便了解它们的优缺点。在Oracle中,这些通常是INDEX RANGE SCAN,FULL INDEX SCAN,FAST FULL INDEX SCAN和INDEX SKIP SCAN。这些知识将帮助您了解是否可以使用索引以及以何种方式使用索引。