2 min read

Database Indexing

Database indexing is a data structure technique used to quickly locate and access the data in a database table. Indexes are created using a few database columns.

1. The Concept

Think of a database index like the index at the back of a book.

  • Without an index: To find a specific topic, you have to flip through every page of the book (Full Table Scan).
  • With an index: You look up the topic in the index, find the page number, and go directly there.

2. How it Works (B-Trees)

Most relational databases use B-Trees (Balanced Trees) for indexing.

  • A B-Tree keeps data sorted and allows searches, sequential access, insertions, and deletions in logarithmic time.
  • Instead of scanning $N$ records (O(N)), the database traverses the tree levels (O(log N)).

3. Pros and Cons

Indexing is a trade-off.

  • Pros (Reads): Drastically speeds up SELECT queries involving WHERE, JOIN, and ORDER BY clauses.
  • Cons (Writes): Slows down INSERT, UPDATE, and DELETE operations. Every time you change data, the database must update the indexes as well.
  • Cons (Storage): Indexes take up disk space and memory.

4. Types of Indexes

Clustered Index (Primary)

  • Determines the physical order of data in the table.
  • A table can have only one clustered index (usually the Primary Key).
  • The leaf nodes of the B-Tree contain the actual row data.

Non-Clustered Index (Secondary)

  • Stored separately from the table data.
  • Contains the column value and a pointer (reference) to the actual row in the table.
  • A table can have multiple non-clustered indexes.

Composite Index

  • An index on two or more columns.
  • Order matters: An index on (Lastname, Firstname) is useful for searching by Lastname OR Lastname+Firstname, but NOT just Firstname.

5. When to Index?

  • Do Index: Columns frequently used in WHERE, JOIN keys, and ORDER BY clauses.
  • Don't Index: Small tables, columns with low cardinality (e.g., "Gender" with only 2 values), or columns that are frequently updated but rarely searched.

6. B-Trees vs. LSM Trees

While B-Trees are the standard for relational databases (read-heavy), Log-Structured Merge-trees (LSM Trees) are popular in NoSQL databases (write-heavy).

B-Trees (Read Optimized)

  • Structure: Data is stored in a sorted tree structure on disk.
  • Writes: Random writes are slow because they require disk seeks to update specific pages in the tree.
  • Reads: Fast. $O(\log n)$ to find any key.
  • Used By: MySQL (InnoDB), PostgreSQL.

LSM Trees (Write Optimized)

  • Structure: Writes are appended to a log in memory (MemTable) and flushed to disk as sorted immutable files (SSTables). Background processes merge these files (Compaction).
  • Writes: Extremely fast (sequential writes).
  • Reads: Slower. Might need to check MemTable and multiple SSTables on disk.
  • Used By: Cassandra, RocksDB, LevelDB.

programming/database-basics programming/system-design-interview-basics