📚 Related Reading

← Back to Home

WordPress Database Optimization Deep Dive: Autoloaded Options and Object Cache

WordPressdatabase optimizationObject CacheRedisWP-CLIspeed2026

WordPress slows down over time, and most people blame their server. The reality: 80% of the time, the problem is at the database layer — repeated queries for data that should have been cached.

This article covers two things in depth: why Autoloaded Options are a silent killer, and how to configure Redis Object Cache to actually reduce query volume.

Autoloaded Options: The Hidden Time Bomb in wp_options

WordPress's autoload mechanism loads ALL options with autoload='yes' from wp_options into memory on every page request. Sounds fine in theory — but if you've installed dozens of plugins over years, your wp_options table might have accumulated 1,000+ autoload records, each request loading all 1,000.

Real-world data (from one of my VPS WordPress sites, before cleanup):

Steps to clean up Autoloaded Options:

# 1. See which options are taking the most space
wp db query "SELECT option_name, LENGTH(option_value) as size FROM wp_options WHERE autoload='yes' ORDER BY size DESC LIMIT 20;"

# 2. Identify which plugins are writing autoload options
wp eval 'global $wpdb; $results = $wpdb->get_results("SELECT DISTINCT autoload FROM wp_options"); print_r($results);'

# 3. Clean suspicious transients (transients are a major autoload offender)
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND autoload='yes';"
wp db query "DELETE FROM wp_options WHERE option_name LIKE '_site_transient_%' AND autoload='yes';"

Options that MUST keep autoload:

What's safe to change to autoload=no:

wp_postmeta N+1 Query Trap

WordPress stores post metadata in wp_postmeta with no index by default. When you call get_post_meta() for a field without an index, MySQL does a full table scan.

Typical scenario: theme's the_meta() function or some SEO plugin meta reading, each time you loop through a post list:

// This loop on an archive page is an N+1 disaster
while (have_posts()) {
    the_post();
    $views = get_post_meta(get_the_ID(), 'post_views', true);
    $likes = get_post_meta(get_the_ID(), 'post_likes', true);
}

100 posts in a list page = 201 queries (1 + 100×2).

Diagnosing N+1 problems:

# Using Query Monitor plugin (WordPress admin) or WP-CLI query analysis
wp eval '
global $wpdb;
$results = $wpdb->get_results("
    SELECT meta_key, COUNT(*) as cnt
    FROM wp_postmeta
    GROUP BY meta_key
    ORDER BY cnt DESC
    LIMIT 30
");
foreach ($results as $row) {
    echo $row->meta_key . ": " . $row->cnt . " rows\n";
}

Add indexes to high-frequency meta_keys:

# If post_views and post_likes are high-frequency query fields
wp db query "CREATE INDEX idx_postmeta_key_views ON wp_postmeta(meta_key, post_id);"
# This composite index lets meta_key + post_id queries use the index

Redis Object Cache: Reduce Database Reads to Near Zero

The real solution: Object Cache. All query results cached in Redis, subsequent identical requests return from memory, never touching the database.

Install Redis server (Ubuntu 24.04):

sudo apt update
sudo apt install redis-server
sudo systemctl enable redis-server
sudo systemctl start redis-server

Verify Redis is running:

redis-cli ping
# Returns PONG if healthy

Install WordPress Redis plugin:

wp plugin install redis-cache --activate
wp redis enable

Configure Object Cache persistence (critical, otherwise lost on restart):

// In wp-config.php (place after ABSPATH definition)
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', '6379');
define('WP_REDIS_DATABASE', '0');
define('WP_REDIS_PREFIX', 'wp_');
define('WP_REDIS_MAXTTL', 86400 * 7); // Cache expires in 7 days

Real-world results (same site, after Redis enabled):

ScenarioNo RedisWith Redis
Homepage (cached)180ms8ms
Post page (first visit)210ms195ms (writing cache)
Post page (cached)210ms12ms
Category page (complex query)350ms25ms

The key insight: first visit is slow (must write cache), but subsequent visits come directly from Redis at 90%+ speed improvement.

When to Use Redis vs When Not To

Scenarios where Redis makes sense:

Scenarios where Redis is wrong:

Alternative: WP Super Cache HTML Caching

If VPS RAM is tight and Redis is too heavy, WP Super Cache page-level HTML caching is more practical:

wp plugin install wp-super-cache --activate

Admin settings: Settings → WP Super Cache → Caching Mode: Recommended (Mod_Rewrite)

HTML caching issue: not suitable for dynamic sites (e-commerce, membership), but works great for blogs and brochure sites.

Pitfalls I Hit (So You Don't Have To)

Pitfall 1: Redis version too old causes connection failure

Ubuntu 24.04's default Redis is 7.x, but some older VPS Redis 3.x is incompatible with the OBJECT ENCODING command.

Symptom: WordPress Redis plugin errors with Redis server went away

Solution: Update Redis or use phpredis extension (instead of predis)

# Check Redis version
redis-server --version
# If 3.x, consider upgrading or using Unix Socket connection

Pitfall 2: WP_REDIS_PATH configured wrong in wp-config.php

WP_REDIS_PATH is a Unix socket path, not a file path. Newcomers often get confused:

// Correct: Redis TCP connection
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', '6379');

// Correct: Redis Unix Socket (better performance)
define('WP_REDIS_PATH', '/var/run/redis/redis-server.sock');

// Wrong: Common mistake — both together causes conflict
define('WP_REDIS_PATH', '/var/run/redis/redis-server.sock');
define('WP_REDIS_HOST', '127.0.0.1'); // These conflict!

Pitfall 3: Redis memory full causes Object Cache failure

Redis default maxmemory policy is noeviction — when memory is full, it stops writing without throwing errors.

Monitor Redis memory usage:

redis-cli info memory | grep used_memory_human
# If approaching maxmemory, WP Object Cache hit rate drops sharply

Solution: Set expiration policy in wp-config.php

define('WP_REDIS_MAXTTL', 86400); // Let Redis auto-evict old cache

Verify Results: How to Confirm 80% Database Query Reduction

Install the Query Monitor plugin, look at database query count in the WordPress admin toolbar.

Target:

If you hit these numbers, Object Cache is working.

Quick diagnosis with WP-CLI:

wp cache flush  # Clear all cache, retest
# Visit homepage once
wp eval 'echo get_num_queries() . " queries took " . timer_stop(0) . "s";'

---

WordPress slowness isn't always a server problem. Database layer Autoloaded Options and N+1 queries are the hidden killers. Clean up wp_options autoload records, add indexes to high-frequency meta_keys, then pair with Redis Object Cache — three steps and database queries drop 80%.

If your VPS RAM is tight, WP Super Cache's HTML caching is a more practical alternative. Choose based on your server config — don't force Redis on a memory-constrained setup.

👉 Join MiniMax AI Acceleration Plan: https://platform.minimaxi.com/subscribe/token-plan?code=E5yur9NOub&source=link

Verified Information (from this article):

🔗 Related Tech Articles

Deep dive into related technical topics:

WordPress Database Optimization Deep Dive: Autoloaded Options and Object Cache
技术标签: database optimization, object cache
WordPress数据库优化深度指南:Autoloaded Options与Object Cache实战
技术标签: 数据库优化, object cache
WordPress数据库优化深度指南:Autoloaded Options与Object Cache实战
技术标签: 数据库优化, object cache
🌐 WordPress Hosting
查看推荐 →