Optimization Guide

WordPress
Autoload Bloat

Every WordPress request loads your entire autoload set from wp_options. If it's bloated, every page pays the price.

Audit Your Autoloaded Data: Two Queries

Paste these into phpMyAdmin, Adminer, or wp db query - the first gives your total autoload size in KB, the second lists the 25 options actually causing it. Adjust the wp_ prefix if yours differs.

-- Total autoloaded data (KB) + row count
SELECT ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS autoload_kb,
       COUNT(*) AS autoload_count
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto', 'auto-on');
-- Top 25 offenders, biggest first
SELECT option_name,
       ROUND(LENGTH(option_value) / 1024, 1) AS size_kb,
       autoload
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto', 'auto-on')
ORDER BY LENGTH(option_value) DESC
LIMIT 25;
Why the IN (...) list matters

WordPress 6.6+ writes 'auto' and 'auto-on' alongside the classic 'yes' and 'on'. Any audit query that only checks autoload = 'yes' undercounts your real autoload size - which is why so many sites look fine on paper and still load a bloated set on every request.

WordPress Autoloader vs Autoloaded Data

"Autoloader" means two unrelated things in WordPress, and searching for it returns both. Worth thirty seconds to check which one you have.

What people call it What it actually is Does it slow your site?
The PHP class autoloader
Composer, spl_autoload_register, PSR-4
A function that loads a PHP class file the first time the class is used, so you don't write require by hand. Almost never. It is a filesystem lookup, usually cached by OPcache.
Autoloaded options
The autoload column in wp_options
Rows WordPress pulls into memory on every request, before any of your code runs. Yes. This is the one that costs you, and it is what the rest of this page is about.

If you arrived here after a host flagged "autoloaded data", or after seeing alloptions in a profiler, you want the second one. If you are debugging a Class not found fatal, you want the first, and this page will not help - that is a Composer or PSR-4 problem.

The phrase "plugin autoloader" is ambiguous in the same way. A plugin ships a Composer autoloader for its own classes, and it also writes autoloaded options. Only the second shows up in the query below.

What Is Autoloaded Data?

WordPress has a single query that runs on every page load, before any theme or plugin code executes:

SELECT option_name, option_value
FROM wp_options
WHERE autoload = 'yes'

This loads all "autoloaded" options into memory at once. WordPress core needs about 100KB of this data. The problem is that plugins abuse it.

The Pattern

You deactivate a plugin. Its data stays in wp_options with autoload='yes'. You install 30 plugins over 2 years. Now you're loading 5MB of data on every request—most of it from plugins you don't even use anymore.

Unlike slow queries that spike your TTFB intermittently, autoload bloat is a constant tax. It adds latency to every single request—cached or not, frontend or admin, AJAX or page load.

Healthy Autoload Size: Thresholds for wp_options

Treat total autoload size as a budget, not a vanity metric. Run the audit query above, then read your number against this table.

<300KB
Healthy
300–800KB
Worth Investigating
>800KB
Action Required
Autoload size Verdict What to do
Under 300 KB Fine Nothing. WordPress core alone needs roughly 100 KB - you're in normal territory. Re-check after big plugin installs or a migration.
300–800 KB Watch Run the top-25 query. Note which plugins own the biggest rows, and disable autoload on orphans and stale caches before they grow.
800 KB–1 MB Act You've crossed the line most managed hosts flag. Schedule a cleanup this week. Prefer autoload='no' over deleting rows.
Over 1 MB Urgent WordPress caches the whole autoload set as a single alloptions key. Many Redis/Memcached setups cap one value at ~1 MB, so an oversized set can silently fail to cache - or surface as intermittent 502s under load.

Sites over 3MB of autoloaded data are common. We've seen sites with 10MB+ —that's 10MB transferred from MySQL to PHP on every single request, before WordPress even starts building the page.

WP Engine "Autoloaded Data" Warning: What To Do

WP Engine flags autoloaded data once it passes 800 KB and calls anything below that within normal range. It is one of the few hosts that surfaces this as a dashboard warning, which is why most people meet the problem through them. The physics are host-agnostic - every request pulls the whole set into PHP whoever you are with.

The warning tells you a number and nothing else. Here is what to do with it.

  1. Measure it yourself first. Run the audit query at the top of this page. Host dashboards sample on a schedule, so the number you see can be hours old, and some panels still test autoload = 'yes', which undercounts on WordPress 6.6+ because core now also writes 'on', 'auto' and 'auto-on'. A panel saying "within normal range" is not proof.
  2. Find the offenders, not the total. The total is a symptom. List the top 25 rows by LENGTH(option_value) and you will usually find three or four rows carrying most of the weight.
  3. Check each one against the do-not-touch list further down this page before changing anything. Some large autoloaded options are supposed to be large.
  4. Flip autoload off, do not delete. wp option set-autoload OPTION_NAME off leaves the data intact and reversible. Deleting rows is how you break a plugin's settings.
  5. Re-measure and let the panel catch up. The warning clears on WP Engine's next check, not instantly.

One caveat specific to managed hosts on memcached: above roughly 1 MB the autoload blob can exceed the per-key limit, so it silently fails to cache and every request goes back to the database. That is worse than the warning suggests, and it shows up as random 502s in wp-admin rather than as a slow page.

Getting under 800 KB by hand is a couple of hours of careful work. WP Multitool's Autoloader Optimizer does the same audit, categorises every row, and flips the safe ones with a one-click restore behind it.

What Causes WordPress Autoload Bloat

1. Deactivated Plugin Leftovers

Most plugins don't clean up after themselves. They add options on activation and leave them forever—even after deactivation and deletion. Find them:

SELECT option_name, LENGTH(option_value) AS size
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 20;

Look for option names from plugins you no longer use. These are safe to set to autoload='no' or delete entirely.

2. Serialized Arrays That Grow

Some plugins store growing data in a single option: logs, analytics snapshots, cron schedules. A single option_value can be 500KB+ of serialized PHP.

3. Expired Transients

Transients are temporary cached values stored in wp_options. Without an external object cache, expired transients accumulate. WordPress only cleans them lazily—when they're next accessed. These stale transients can also show up as slow queries when the table grows large enough.

SELECT COUNT(*) FROM wp_options
WHERE option_name LIKE '_transient_%'
AND autoload = 'yes';

4. Misconfigured Plugins

Plugins that store per-user settings, large JSON configs, or cached API responses in autoloaded options. The data might be needed, but it doesn't need to load on every request.

How to Audit Autoloaded Data in wp_options

  1. Check total autoload size — Run the SQL query above. Over 1MB means immediate investigation is needed.
  2. Find the biggest offenders — Sort autoloaded options by LENGTH(option_value). The top 10 usually account for 80%+ of the bloat.
  3. Identify orphaned data — Cross-reference option names with your active plugins. Options from deactivated plugins are safe to touch.
  4. Test before changing — Set autoload='no' one option at a time. Verify the site still works. Some options genuinely need autoloading (core settings, active theme/plugin configs).
  5. Clean expired transients — Delete transients that have passed their timeout. This is always safe.

What NOT to Turn Off

Flipping autoload is reversible. Deleting rows is not. But some options must stay autoloaded while their owner is active, or WordPress and your plugins break early in the bootstrap - and it won't error, it will just quietly degrade. Use this as a check before any bulk change.

Keep autoloaded (while in use) Usually safe to set autoload='no'
cron - the whole WP-Cron event map;
active_plugins, template, stylesheet;
siteurl, home, blogname, blogdescription;
user_roles, permalink_structure, rewrite_rules;
theme_mods_{active-theme} for the live theme;
runtime settings of active plugins - WooCommerce store config, Yoast wpseo_*, firewall rules
Orphaned rows from deleted plugins (prefix matches nothing installed);
stale _transient_* and _site_transient_* - caches by definition;
update-check leftovers: _site_transient_update_plugins, _site_transient_update_themes, _site_transient_update_core;
queue and telemetry bookkeeping: action_scheduler_*, wc_tracks_*;
oversized page-builder CSS/asset blobs (_elementor_* and Divi are repeat offenders in the top-25 list)

The rule: if the plugin is active and the option is configuration it reads on every request, leave autoload on. If the plugin is gone, or the value is a cache, log, or queue blob, disable autoload first - and only delete once you've confirmed nothing still reads the row.

Common Autoload Offenders: Is It Safe to Disable?

Twenty prefixes I see over and over, and what I do with each. "Caution" means the answer depends on whether the plugin is still active - check that first.

Option / prefix Source Safe to disable autoload?
_transient_* / _site_transient_*WordPress core + any plugin (transients)Yes - transients are caches by definition; on object-cache sites they shouldn't sit in wp_options at all.
action_scheduler_*Action Scheduler (WooCommerce and others)Yes - queue bookkeeping, loaded on demand when the scheduler runs.
wc_tracks_*WooCommerce (telemetry)Yes - usage tracking events, nothing user-facing depends on them.
woocommerce_* (settings)WooCommerce coreNo - currency, tax, and checkout config that Woo reads on every request.
elementor_*Elementor (settings)Caution - runtime settings are needed while active; only safe once Elementor is deactivated.
_elementor_*Elementor (internal / cache data)Caution - some entries are CSS/asset cache (safe), others are runtime state; audit row by row.
jetpack_* / _jetpack_*JetpackCaution - connection tokens and sync state; flipping the wrong one can break the WordPress.com connection.
wpseo_* / wordpress_seo_*Yoast SEONo while active - titles, metas, and indexable settings load on every frontend request. Yes if Yoast was removed.
aioseo_*All in One SEOCaution - core settings stay while active, but AIOSEO is known for oversized cache/log options that are safe to flip.
rank_math_*Rank MathCaution - runtime settings No, analytics/cache blobs Yes; same split as AIOSEO.
wpforms_*WPFormsCaution - settings are needed while active; challenge, notification, and log entries are safe.
wf* / wflogsWordfenceCaution - firewall config is read every request while active; log-style rows and orphans after removal are a hard Yes.
redirection_*RedirectionCaution - the plugin needs its settings early to run redirects; only flip if the plugin is gone.
et_*Divi (Elegant Themes)Caution - active-theme settings No; if you switched away from Divi, everything et_* is dead weight - Yes.
edd_*Easy Digital DownloadsCaution - store settings needed while active; tracking and session leftovers are safe.
learndash_*LearnDashCaution - course and runtime settings while active; safe only if LearnDash was removed.
tribe_events_*The Events CalendarCaution - known for large autoloaded cache entries (often safe), but core settings are runtime.
fs_accountsFreemius SDK (bundled in many plugins)Caution - one row shared by every Freemius-based plugin; licensing breaks if you flip it while any of them is active.
rewrite_rulesWordPress coreCaution - often the single biggest option, but WordPress needs it to route URLs. Never delete; if it's huge, find the plugin bloating it.
cronWordPress coreNo - the entire WP-Cron schedule lives here; disabling autoload breaks scheduled tasks.

How to Fix Autoload Bloat in WordPress

Disable Autoload for Specific Options

UPDATE wp_options SET autoload = 'no'
WHERE option_name = 'old_plugin_settings';

Clean Expired Transients

DELETE FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
AND option_value < UNIX_TIMESTAMP();

Delete Orphaned Plugin Data

-- Only after confirming the plugin is gone:
DELETE FROM wp_options
WHERE option_name LIKE 'removed_plugin_%';

The problem with manual fixes: they don't stay fixed. Plugins keep adding data. Transients re-accumulate. New plugins bring new autoloaded options. You'd need to audit monthly to keep it under control.

Why Autoload Bloat Keeps Growing

Autoload bloat is progressive. It grows slowly, 50KB at a time, invisible until your site is noticeably slower and you can't figure out why.

  1. New plugin installed → 200KB of autoloaded config options
  2. Plugin deactivated → data stays, still autoloading
  3. Transient cache miss → new transient stored with autoload
  4. Plugin update → migration adds new autoloaded rows

If you're also noticing a slow WordPress admin dashboard, autoload bloat is often the hidden cause. You need a tool that monitors your autoload size continuously and tells you exactly which options are wasting memory—before it becomes a performance problem.

Automate Autoload Cleanup

WP Multitool's Autoloader Optimizer monitors your wp_options table, identifies bloated and orphaned autoloaded data, and shows you exactly what's safe to clean up.

Get WP Multitool How the Autoloader Optimizer Works