The Different Kinds of Indexes in SQL (Use Cases)

📅 April 12, 2026

Clustered Index

  • Defines the physical order of rows.
CREATE CLUSTERED INDEX IX_Users_UserId
ON Users(UserId);

Use Case

  • Fast lookups and range queries on primary keys.

Non‑Clustered Index

  • Logical index pointing to the clustered key.
CREATE INDEX IX_Orders_UserId
ON Orders(UserId);

Use Case

  • Speed up WHERE, JOIN, ORDER BY, GROUP BY.

Composite Index (Multi‑Column)

  • Note: Order matters.
CREATE INDEX IX_Orders_UserId_CreatedAt
ON Orders(UserId, CreatedAt);

Use Case

  • Queries filtering by both columns: WHERE UserId = 10 AND CreatedAt >= '2024-01-01'

Covering Index (INCLUDE)

  • Avoids table lookups. CREATE INDEX IX_Orders_UserId_Cover ON Orders(UserId) INCLUDE (OrderDate, Amount);

Use Case

  • Query is fully satisfied by the index:
SELECT OrderDate, Amount
FROM Orders
WHERE UserId = 10;

Unique Index

  • Enforces uniqueness.
CREATE UNIQUE INDEX IX_Users_Email
ON Users(Email);

Use Case

  • Prevent duplicate emails or usernames.

Filtered Index

  • Index only a subset of rows.
CREATE INDEX IX_Orders_Active
ON Orders(Status)
WHERE Status = 'Active';

Use Case

  • Fast queries on sparse data: WHERE Status = 'Active'

Full‑Text Index

  • Optimized for text search.
CREATE FULLTEXT INDEX ON Articles(Content)
KEY INDEX PK_Articles;

Use Case

Searching long text:

SELECT * FROM Articles
WHERE CONTAINS(Content, '"machine learning"');

Columnstore Index

  • Column-based storage for analytics.
CREATE CLUSTERED COLUMNSTORE INDEX IX_Sales
ON Sales;

Use Case

  • Data warehouse queries:
SELECT Region, SUM(Amount)
FROM Sales
GROUP BY Region;

Hash Index (Memory‑Optimized Tables)

  • Used in in-memory OLTP. CREATE HASH INDEX IX_Users_Email ON Users(Email) WITH (BUCKET_COUNT = 1024);

Use Case

  • High‑concurrency lookups on memory‑optimized tables.

Summary

Index Type What It Does Best Use Case
Clustered Index Defines physical row order Primary key, range queries, ever-increasing values
Non-Clustered Index Logical index for fast lookups WHERE, JOIN, ORDER BY, GROUP BY
Composite Index Multi-column index in defined order Multi-column filters (e.g., UserId + CreatedAt)
Covering Index Includes extra columns to avoid table lookups SELECT-heavy queries needing extra columns
Unique Index Enforces uniqueness Email, username, code fields
Filtered Index Index on a subset of rows Sparse data (IsActive = 1, IsDeleted = 0)
Full-Text Index Optimized for text search Searching long text or phrases
Columnstore Index Column-based storage for analytics Data warehouses, aggregations, large fact tables
Hash Index In-memory optimized hash lookup Memory-optimized tables, high-concurrency workloads