Databases 14 min read

Mastering MySQL Passive Performance Optimization: Principles & Practical Solutions

This article explains the core principles of performance optimization, distinguishes active and passive approaches, and provides detailed MySQL passive tuning techniques—including index usage, data partitioning, slow‑query logging, and read/write splitting—to prevent and resolve slow SQL queries.

macrozheng
macrozheng
macrozheng
Mastering MySQL Passive Performance Optimization: Principles & Practical Solutions

“Youth knows not the pain of optimization; only when encountering pitfalls does one realize its difficulty.”

Performance Optimization Principles and Classification

Performance optimization can be divided into:

Active optimization – self‑initiated improvements without external prompts.

Passive optimization – improvements triggered by observed slowdowns, errors, or abnormal hardware metrics.

Both approaches must obey three principles:

Do not alter the service logic; maintain correctness.

Ensure safety throughout the optimization process and results.

Preserve stability; never sacrifice reliability for speed (e.g., do not disable Redis persistence for speed).

The guiding insight is to prioritize preventive measures and use passive optimization as a supplement.

MySQL Passive Performance Optimization

This section focuses on passive optimization techniques for MySQL, addressing three common problems.

Problem 1: Single SQL Query Runs Slowly

Analysis

Typical causes are missing or misused indexes and excessive table data volume.

Solution 1: Create and Properly Use Indexes

Check that indexes exist and that queries can leverage them. Avoid:

Using != or <> in WHERE clauses, which forces full table scans.

Leading wildcard patterns like '%value' or '%value%', which prevent index usage.

OR conditions that prevent index usage unless each column involved has an index.

Applying functions or expressions to indexed columns in WHERE clauses.

Additional tips:

Prefer primary‑key queries to avoid back‑table lookups.

Simplify complex statements; break them into smaller queries to reduce lock time.

Use numeric fields for numeric data; avoid storing numbers as strings.

Replace IN with EXISTS when appropriate.

Avoid IS NULL or IS NOT NULL on indexed columns.

Back‑table query: after using a non‑unique index, MySQL may need to fetch the primary key to retrieve full rows.

Solution 2: Data Partitioning

If a table grows too large, split it to improve query speed.

Vertical Partitioning

Separate frequently accessed columns into one table and less‑used columns into another; also move large TEXT / BLOB fields to auxiliary tables.

Horizontal Partitioning

Distribute rows across multiple tables (e.g., sharding by user ID modulo) when row count exceeds a threshold such as two million.

Other Table Optimizations

Use the smallest suitable data types.

Prefer INT over VARCHAR for numeric data.

Prefer TINYINT, SMALLINT, MEDIUMINT over INT.

Define columns as NOT NULL when possible to save space.

Minimize use of TEXT; consider splitting if unavoidable.

Prefer TIMESTAMP over DATETIME.

Keep the number of columns per table reasonable (around 20).

Problem 2: Partial SQL Queries Run Slowly

Analysis

Identify the slow queries first, then apply the indexing solutions from Problem 1.

Solution: Slow Query Log Analysis

Enable MySQL’s slow‑query log to capture statements exceeding long_query_time (default 10 seconds). Check if the log is enabled: mysql> show variables like '%slow_query_log%'; If the value is OFF, the log is disabled.

Enable Slow Query Log

Temporarily enable with:

mysql> set global slow_query_log=1

For a permanent change, edit my.cnf:

slow_query_log = 1 slow_query_log_file = /tmp/mysql_slow.log

After enabling, review the log file to locate and optimize each slow statement.

Problem 3: Entire SQL Workload Is Slow

Analysis

When overall performance degrades, the database has reached its capacity limits.

Solution: Read‑Write Splitting

Separate read‑heavy traffic from writes by using a master‑slave architecture: the master handles writes, slaves handle reads.

Two common approaches:

Application‑Level Routing

Use frameworks (e.g., Spring MVC + MyBatis) with AOP or annotations to direct queries to the appropriate data source.

Middleware Solution

Deploy MySQL middleware such as MySQL Proxy, Amoeba, or Atlas to manage master‑slave routing, decoupling it from application code.

Extended Knowledge: SQL Statement Analysis

Use the EXPLAIN command to inspect query execution plans, revealing fields like id, select_type, type, key, and rows. The type column indicates access method, ranging from ALL (full table scan) to CONST (constant lookup).

Conclusion

The article presented MySQL performance optimization principles, distinguishing active and passive methods while emphasizing correctness, safety, and stability. It highlighted preventive and passive strategies and detailed solutions for three typical slow‑SQL scenarios, aiming to help readers improve MySQL reliability and efficiency.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

performance optimizationdatabaseSQL TuningPassive Optimization
macrozheng
Written by

macrozheng

Dedicated to Java tech sharing and dissecting top open-source projects. Topics include Spring Boot, Spring Cloud, Docker, Kubernetes and more. Author’s GitHub project “mall” has 50K+ stars.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.