sql - 索引只影响 WHERE 子句?

标签 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 行 并且大多数 field_x 值都是唯一的。

因为我没有使用任何 WHERE 子句,创建的索引对我的查询有任何影响吗?

编辑:我问这个问题是因为我没有发现创建索引前后查询时间之间的任何相关差异;它们总是需要大约 8 秒(当然时间太多了!)。这种行为是预期的吗?

最佳答案

索引在这里无济于事,因为您正在读取整个表,无论如何首先访问索引是没有用的(PostgreSQL 还没有仅索引扫描)

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

索引可能用于排序的可能性很小,但我对此表示怀疑。

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

如果排序是在磁盘上完成的,您可以通过增加 work_mem 来加快查询速度 - 无论是全局还是仅针对您的 session 。

关于sql - 索引只影响 WHERE 子句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607933/

相关文章:

postgresql - 查找所有输入参数和与这些输入参数对应的查询

dictionary - 如何获取 TreeMap 中索引的键

php - 我的 SQL 查询有什么问题?

php - PHP 中的库存变动

java - 无法获取 SequenceInformation 并且在 ResultSet 中找不到列 start_with

mysql - 由于查询而导致性能下降?

r - 创建连续整数,然后使用 dplyr 创建存储在 sqlserver 中的表的索引

sql - 如何编写这个特定的查询?

sql - 在WHERE中使用Oracle内置UPPER函数会导致SELECT语句的性能下降吗?

mysql - 如何从相同的两个表运行两个 LEFT 连接,但连接到这些表中的不同字段