Pay For Results. Our new Performance Model is live.

wp_options autoload: What It Does and What Is Safe to Change

The autoload column decides what WordPress loads on every single request. Here is what the five values mean, how to find what is bloating your alloptions query, and what is genuinely safe to turn off.

Picture of Adam Walters
Adam Walters

Founder

wp_options.autoload. The column that decides what gets loaded on every single page request.
IN THIS ARTICLE

You sorted wp_options by value size, and something near the top has autoload set to yes, or on if the row was written by WordPress 6.6 or later. Maybe Site Health told you your autoloaded options total 1.4 MB and left it at that. Either way you are now looking at a column with five possible values and no obvious rule for which one is right.

The autoload column is one of the few places in a WordPress database where a one-word change measurably affects every page load on the site. It is also one of the easiest places to make a site slower while believing you are making it faster.

What the autoload column actually does

On every request, before your theme renders anything, WordPress calls wp_load_alloptions(). That function runs a single query along these lines:

SELECT option_name, option_value FROM wp_options
WHERE autoload IN ('on','auto-on','auto','yes');

The whole result set goes into the object cache under the key alloptions. Every get_option() call for the rest of that request is then served from memory instead of the database.

That is the trade. Autoloaded options cost one query for all of them together. Non-autoloaded options cost one query each, on demand. Twenty small options read on every page belong in the autoloaded set. One 500 KB blob read on a single admin screen does not.

The five values, and what changed in WordPress 6.6

Before 6.6 the column held yes or no. WordPress 6.6 replaced that with five values so core could tell a developer’s explicit choice apart from its own automatic one.

ValueSet byMeaning
onDeveloper, explicitlyAlways autoload, whatever the size
offDeveloper, explicitlyNever autoload
autoCore, no preference expressedFollows the default, which currently autoloads
auto-onCore, dynamicallyShould autoload
auto-offCore, dynamicallyShould not autoload. This is what oversized options get
yes / noWordPress 6.5 and earlierLegacy values, still honoured as on and off
The autoload column after WordPress 6.6. Existing rows were never migrated, so most established sites hold a mixture of old and new values.

That last row is the part almost every older tutorial gets wrong. The 6.6 upgrade did not rewrite your existing rows. There is no migration. Options written or updated since the upgrade carry the new values; everything untouched since 2024 still says yes or no. Any query you run has to cover both vocabularies or it will quietly report a fraction of the truth.

Since 6.6, an option written through add_option() or update_option() whose value exceeds 150,000 bytes, and which does not explicitly pass true for the $autoload parameter, is stored as auto-off. The threshold is filterable through wp_max_autoloaded_option_size.

Diagram showing that a transient saved with no expiration is stored with autoload set to on, while a transient with an expiration is not autoloaded

Why the autoloaded set gets large

Three causes, in roughly the order we find them on client sites.

Transients with no expiry. set_transient() decides autoload from the expiration argument, not from the size of the value. Pass an expiration and the value is stored with autoload off. Pass nothing and it is autoloaded, permanently. A plugin that caches a large API response with no expiry has effectively added that response to every page load on your site.

Orphaned options from plugins you removed. Deactivating a plugin does not remove its options, and plenty of plugins skip cleanup even on uninstall. Those rows keep their old yes and keep loading on every request for years.

Genuinely large settings blobs. Page builders, form plugins and security plugins store serialized arrays that grow with use. Most of them were written before the 150 KB rule existed and set autoload explicitly, which means the rule never applies to them.

Find out what is actually autoloading

Start with the total. Run this against your database, changing the wp_ prefix if yours differs:

SELECT ROUND(SUM(LENGTH(option_value)) / 1024) AS autoloaded_kb
FROM wp_options
WHERE autoload IN ('yes','on','auto','auto-on');

Then the offenders:

SELECT option_name, autoload, ROUND(LENGTH(option_value) / 1024) AS kb
FROM wp_options
WHERE autoload IN ('yes','on','auto','auto-on')
ORDER BY LENGTH(option_value) DESC
LIMIT 25;

Both queries list all four autoloading values on purpose. A query that checks only autoload = 'yes' misses everything written since the 6.6 upgrade, and a query that checks only 'on' misses everything written before it.

If you would rather not touch SQL, WordPress ships a version of this check. Tools → Site Health → Status flags autoloaded options once the total passes 800,000 bytes, a limit filterable through site_status_autoloaded_options_size_limit. Treat it as a trigger to look, not a target to hit. Plenty of sites run happily above it, and some struggle well below it.

With WP-CLI, the total is one command:

wp option list --autoload=on --format=total_bytes
Comparison showing small frequently-read options should stay autoloaded, while large rarely-read option values are the ones worth turning off

What to actually change

Work down your list of the 25 largest and put each row into one of three buckets.

  1. You recognise it and it is read on every page. Leave it alone, however large it looks.
  2. You recognise it and it is read on one admin screen or one template. Turn autoload off.
  3. You do not recognise it and the plugin is long gone. It is an orphan. Take a backup, then delete the row.

Changing autoload does not change the stored value. With WP-CLI:

wp option set-autoload my_big_option off

Or in PHP, wp_set_option_autoload( 'my_big_option', false ).

Here is the caveat that turns this exercise negative for a lot of people. Switching autoload off on a small option that gets read on every request converts one shared query into an extra query per request, forever. You have not trimmed the site, you have added work to it. Below roughly 1 KB there is nothing worth reclaiming, and the risk of guessing wrong about how often something is read is real. Chase the top of the list and stop when the numbers get boring.

One last step people skip: flush the object cache afterwards. Redis or Memcached will happily keep serving the old alloptions entry, and you will conclude the change did nothing.

Where this fits with the rest of the database

Autoloaded options are one of four or five things that reliably make a WordPress database slow, and they are the cheapest to fix. The others are usually tables that grow without a cleanup routine: the Action Scheduler actions table when a scheduled job stops running, the Yoast indexables table on large content sites, and the logging tables that security plugins fill. We walk through the full sequence in our guide to WordPress database optimization.

If you would rather this were simply handled (monitored, cleaned and kept clean without you opening phpMyAdmin again), that is what our managed WordPress hosting covers.

Frequently asked questions

What is a normal size for autoloaded options in WordPress?

There is no official target. WordPress Site Health raises a warning once the total passes 800,000 bytes, and that is the closest thing to an official number. Most healthy sites sit between 200 KB and 800 KB. What matters more than the total is whether one or two rows account for most of it, because that is the case you can actually fix.

Does setting autoload to off delete the option?

No. The stored value is untouched. Only the loading behaviour changes. Instead of arriving with the bulk alloptions query at the start of every request, the option is fetched with its own query the first time something asks for it.

Why does my wp_options table still contain yes and no after upgrading to WordPress 6.6?

Because the upgrade did not migrate existing rows. The values yes and no are still honoured and mean the same as on and off. Only options written or updated since the upgrade use the newer values, so an established site normally holds a mixture of both. A query that checks for only one set will under-report your true autoloaded size.

Should I delete options left behind by plugins I removed?

Only when you are certain the plugin is gone for good, and only after a backup. Deactivation deliberately leaves settings in place so that reactivating restores your configuration. If you delete the rows and reinstall the plugin later, you start from defaults.

Does Redis or Memcached make autoloaded option size irrelevant?

It reduces the cost but does not remove it. The alloptions entry still has to be fetched and unserialized on every request, and a multi-megabyte value is slow at both. Some object cache configurations also refuse to store values above a size limit, at which point WordPress quietly falls back to querying the database on every request, which is worse than where you started.

Can I change the autoload value directly with SQL?

You can, and it works, but wp option set-autoload or wp_set_option_autoload() are safer because they clear the relevant caches for you. If you do run an UPDATE directly, flush the object cache afterwards or the site will keep serving the old alloptions entry and you will think nothing changed.

Is your competitor stealing traffic?

Get a free competitor spy report. See their keywords, backlinks, and map rankings.

SHARE:
WordPress MCP lets AI tools like Claude and ChatGPT act on your site as a…
September 5, 2026
A slow WordPress site is nearly always one of five things, and they are not…
September 1, 2026
Not a philosophy question. Pick by the constraint you actually have this quarter, and Google’s…
August 27, 2026
Get the Blueprint

Join 5,000+ local business owners receiving weekly growth tactics.

Performance Partner Application

We invest our own capital to generate your leads. To ensure this partnership is profitable for both of us, we need to verify a few details about your business.

Let's Connect.

Have a specific question or need a custom proposal? Fill out the form and our team will get back to you within 24 hours.

Get Your Free Audit

See where you stand before you launch.