如果我有类似的话:
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秒钟(当然这是太多时间!)。预期会出现这种情况吗?
答案 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更深入。