如果我有类似的东西:
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 行
并且大多数 field_x
值都是唯一的。
因为我没有使用任何 WHERE
子句,创建的索引对我的查询有任何影响吗?
编辑:我问这个问题是因为我没有发现创建索引前后查询时间之间的任何相关差异;它们总是需要大约 8 秒(当然时间太多了!)。这种行为是预期的吗?
最佳答案
索引在这里无济于事,因为您正在读取整个表,无论如何首先访问索引是没有用的(PostgreSQL 还没有仅索引扫描)
因为索引中的几乎所有值都是唯一的,所以无论如何在这种情况下它都无济于事。索引查找(包括其他 DBMS 的索引扫描)往往对查找少量行非常有帮助。
索引可能用于排序的可能性很小,但我对此表示怀疑。
如果您查看 EXPLAIN ANALYZE VERBOSE
的输出,您可以看到排序是在内存中完成还是(由于结果的大小)在磁盘上完成。
如果排序是在磁盘上完成的,您可以通过增加 work_mem 来加快查询速度 - 无论是全局还是仅针对您的 session 。
关于sql - 索引只影响 WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607933/