2010-06-26 30 views
1

假设我在数据库表上有两个查询。关于数据库表中部分键和索引的问题

查询1:

查询是在查询中使用的字段来定义依赖于F1,F2,和F3

QUERY2:取决于F1,F2,F3和F4

我记得在某处读到SQL查询引擎(本例中为mySQL)从索引中最左边的字段开始解析索引树。

如果这是正确的,那么我认为,而不必像这样在桌子上定义了两个指标:

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3} 
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4} 

我可以简单地定义包含两个查询中使用的密钥的工会一个指标 - 即

我只需要定义这个索引:

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4} 

我有两个问题:

  1. 我的假设是否正确?即我可以简单地定义一个索引(the_idx)而不是前两个?

  2. 此索引行为是否适用于PostgreSQL查询引擎?

+0

这个假设是关于B-TREE的,而不是其他类型的索引。维基百科有关于HASH,GIN,GIST,RED-BLACK等的信息。深入了解数据库的手册,它还包含有关索引实现的更多信息。 – 2010-06-26 16:56:59

回答

1

我的假设是否正确?即我可以简单地定义一个索引(the_idx)而不是前两个?

是的。
它被称为覆盖索引,并且您想要根据最可能使用查询的列来排序。 IE:如果F2是最常见的列,你想使用:

CREATE INDEX the_idx {f2, f1, f3, f4} 

这是否索引行为PostgreSQL的查询引擎保持为真呢?

不,Postgres does not support covering indexes

索引不是ANSI标准;这是一个奇迹,这个术语在供应商之间是如此一致。

0

一般来说,人口较多的指数将是可用的。但是,您添加到该索引的次数越多,需要的开销就越多。

最好的办法是尝试一下,看看执行计划,看看它是否以你期望的方式使用。

根据结果集中返回的实际列,使用更短的索引可能更有利。

0

MySQL manual可以合理地清楚是的,可以在任何非哈希索引(大多数)中搜索关键字的任何“前缀”。

我找不到PostgreSQL的任何可比较的文档,但您始终可以创建表格然后做一个EXPLAIN(无论如何不是一个坏主意)。