Skip to main content
Documents
Clauses StatementsKeywordsExpressionsFunctionsIndexesPerformance Optimization

MySQL Primary vs. Secondary Indexes

Indexes in MySQL are used to speed up the retrieval of rows by utilizing a data structure that allows for quick search, retrieval, and sorting operations. A primary index is based on the primary key and uniquely identifies each record, while a secondary index (also known as a non-clustered index) improves query performance on columns other than the primary key.

Usage

Indexes are used to enhance the performance of database queries by reducing the amount of data MySQL has to scan to find results. A primary index is automatically created when a primary key is defined, whereas a secondary index can be created on any column to optimize query performance.

Syntax

-- Creating a Primary Index
CREATE TABLE example (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- Creating a Secondary Index
CREATE INDEX index_name ON example (name);

In this syntax, the PRIMARY KEY clause creates a primary index on the id column, while the CREATE INDEX statement creates a secondary index on the name column.

Examples

1. Creating a Table with a Primary Key

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

This example creates a primary index on the user_id column, ensuring each user_id is unique and indexed for fast lookups.

2. Adding a Secondary Index

CREATE INDEX idx_email ON users (email);

Here, a secondary index idx_email is created on the email column to accelerate queries filtering on email addresses.

3. Using Multiple Secondary Indexes

CREATE INDEX idx_username_email ON users (username, email);

This example creates a composite secondary index on both username and email, optimizing queries that filter or sort based on both columns.

Tips and Best Practices

  • Limit the number of indexes. While indexes speed up read operations, they can slow down write operations, so use them judiciously.
  • Index selectively. Only index columns that are frequently used in search conditions (WHERE clauses) or as join keys.
  • Consider composite indexes. Use composite indexes when queries often involve multiple columns; this can be more efficient than multiple single-column indexes.
  • Regularly analyze and optimize indexes. Use tools like ANALYZE TABLE and OPTIMIZE TABLE to maintain index efficiency over time.
  • Monitor index usage. Evaluate the performance impact of your indexes and adjust as necessary to balance read and write performance.

Understanding Indexes

  • Clustered vs. Non-Clustered: In MySQL, a primary index is often referred to as a clustered index because it determines the physical order of data in the table. Secondary indexes, or non-clustered indexes, are separate from the data and maintain pointers to the data rows, allowing for faster access on non-primary key columns.

Limitations and Considerations

  • Resource Usage: Indexes consume additional disk space and can increase maintenance overhead, especially on tables with frequent updates, inserts, or deletes.
  • Impact on Performance: While indexes enhance read performance, they may degrade performance on write operations due to the need to update the index data structure.
  • Small Tables: On small tables, the overhead of maintaining indexes might not justify the performance benefits, as full table scans can be faster.

Query Execution Plans

Use EXPLAIN to analyze how indexes impact query execution plans. Understanding the output of EXPLAIN can help you fine-tune your indexes for optimal performance.

SQL Upskilling for Beginners

Gain the SQL skills to interact with and query your data.
Start Learning for Free