Why Indexes Sometimes Make Queries Slower
Indexes are often seen as the ultimate solution to slow SQL queries. While they usually improve performance, there are situations where indexes can actually make queries slower.
Understanding when and why this happens is critical for building fast and scalable databases.
In this article, we’ll explore why indexes sometimes hurt performance and how to avoid common mistakes.
How Indexes Are Supposed to Help
Indexes allow the database to quickly locate rows without scanning the entire table.
In general, indexes help when:
- Tables are large
- Queries filter on selective columns
- Indexes are well maintained
But this is not always the case.
Reason 1: Low Selectivity Indexes
An index on a column with very few unique values is often useless.
Example
CREATE INDEX idx_users_active ON users(active);
If most rows have active = true, PostgreSQL may choose a sequential scan instead of the index.
In some cases, forcing index usage adds unnecessary overhead.
Reason 2: Small Tables
Indexes have a cost. For small tables, scanning the whole table can be faster than using an index.
PostgreSQL is smart enough to avoid indexes when they don’t help — but unnecessary indexes still consume memory and slow writes.
Reason 3: Too Many Indexes
Each index must be updated on INSERT, UPDATE, and DELETE.
Too many indexes lead to:
- Slower writes
- Higher disk usage
- Longer maintenance operations
More indexes ≠ better performance.
Reason 4: Indexes That Don’t Match the Query
Indexes must match how queries are written.
Example
CREATE INDEX idx_orders_created_at ON orders(created_at);
This index won’t help the following query:
SELECT * FROM orders WHERE DATE(created_at) = '2026-01-01';
Because the column is wrapped in a function, PostgreSQL can’t use the index efficiently.
Better Query
SELECT * FROM orders WHERE created_at >= '2026-01-01' AND created_at < '2026-01-02';
Reason 5: Outdated Statistics
PostgreSQL relies on statistics to decide whether to use an index.
If statistics are outdated, the query planner may choose a poor execution plan.
Solution
ANALYZE;
This helps PostgreSQL make better decisions.
Reason 6: Index Bloat
Over time, indexes can become bloated due to updates and deletes.
Bloated indexes:
- Consume more disk space
- Increase I/O
- Slow down scans
Solution
- Use
VACUUM - Rebuild indexes when needed
How to Know If an Index Is Helping
The only reliable way is to measure.
Use EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
Check whether the index is used and how much time it saves.
Best Practices for Using Indexes
- Create indexes for real queries, not assumptions
- Avoid indexing low-selectivity columns
- Remove unused indexes
- Monitor performance regularly
Conclusion
Indexes are powerful, but they are not magic.
When used incorrectly, indexes can slow down queries, waste resources, and complicate maintenance.
The key to performance is not adding more indexes — it’s understanding how your queries actually work.

Comments
Post a Comment