索引仅影响WHERE子句?

时间:2011-01-05 18:42:43

标签: sql postgresql indexing

如果我有类似的话:

CREATE INDEX   idx_myTable_field_x
ON             myTable
USING          btree (field_x);

SELECT COUNT(field_x), field_x FROM myTable GROUP BY field_x ORDER BY field_x;

想象一下,myTable 500,000 rows左右,field_x大部分WHERE值都是唯一的。

由于我不使用任何{{1}}子句,创建的索引在我的查询中是否会有任何影响?

编辑:我问的是这个问题,因为我在创建索引之前和之后的查询时间之间没有任何相关的区别;它们总是花费大约8秒钟(当然这是太多时间!)。预期会出现这种情况吗?

3 个答案:

答案 0 :(得分:6)

索引在这里没有用,因为你正在阅读整个表格,无论如何都没有用到索引(PostgreSQL还没有索引扫描)

因为索引中的几乎所有值都是唯一的,所以无论如何都不会对这种情况有所帮助。索引查找(包括其他DBMS的索引扫描)往往对查找少量行非常有用。

索引可能会被用于订购,但我对此表示怀疑。

如果查看EXPLAIN ANALYZE VERBOSE的输出,您可以看到排序是在内存中完成还是(由于结果的大小)在磁盘上完成。

如果在磁盘上进行排序,您可以通过增加work_mem来加速查询 - 全局或仅为您的会话。

答案 1 :(得分:3)

由于field_x是查询中引用的唯一列,因此您的索引covers可以帮助您避免查找myTable的实际行。

编辑:如下面的评论讨论所示,虽然此答案对大多数RDBMS实施有效,但它不适用于postgresql。

答案 2 :(得分:2)

应该使用索引。如果您想查看索引的使用方式(或不使用),查询的执行计划是查看数据库决定执行操作的好地方。在你的情况下,你应该执行类似的事情:

explain SELECT COUNT(field_x), field_x FROM myTable GROUP BY field_x ORDER BY field_x;

有关您所看到的所有输出的更多信息,请参阅postgres文档:http://www.postgresql.org/docs/8.4/static/sql-explain.html

还有:http://wiki.postgresql.org/wiki/Image:Explaining_EXPLAIN.pdf更深入。