Skip to content

WordPressPart of: WordPress speed and plugins

WordPress admin slow? Heartbeat, autoloaded options, database bloat and admin plugins

A slow WordPress admin is almost always the database, autoloaded options, the Heartbeat API or plugins that do heavy work on admin screens. How to find which one with Query Monitor and Site Health, and how to fix each.

getReport teamUpdated 26 Sept 202613 min read

When the WordPress admin is slow but the public site is fast, the cause is almost never the theme or images. It is the server doing work that only happens for logged-in users: loading oversized autoloaded options, querying a bloated database, answering Heartbeat requests from open tabs, and running plugins that do heavy work on admin screens. None of it is cached, because the admin never is. This guide shows how to find which of these you have in about 20 minutes, and how to fix each one safely. It is part of our guide to why a WordPress site is slow, which covers the front end.

Quick answer

  • Install Query Monitor (on staging if you can) and open the slow admin screen. It shows the page generation time, slow database queries, HTTP calls to other servers and which plugin caused each.
  • Check autoloaded options in Tools → Site Health. Since WordPress 6.6 it warns when autoloaded options exceed 800 KB; find the biggest ones and switch off autoload for those that don't need it.
  • Clean the database: limit post revisions, delete expired transients, trim WooCommerce's Action Scheduler logs, and remove tables left by deleted plugins. Back up first.
  • Tame the Heartbeat API: close idle admin tabs, and slow Heartbeat to 60–120 seconds outside the post editor.
  • Find admin-only heavy plugins: SEO analysis, page builders, backup and security scanners, and dashboard widgets that call external servers.
  • Fix the server basics: PHP 8.3 or newer, OPcache, and a persistent object cache (Redis or Memcached) if the host offers one.

Why is my WordPress dashboard so slow?

Every admin page is built from scratch. A visitor gets a cached copy of a page in 100–300 ms on good hosting; an editor loading Posts → All posts waits for PHP to load WordPress, every active plugin, the full list of autoloaded options, and dozens of database queries. Anything that makes each request more expensive hits the admin first and hardest.

SymptomLikely causeWhere to look
Every admin page is slow, even the empty dashboardAutoloaded options, slow PHP, no object cache, or a slow hostSite Health, Query Monitor's overview
One screen is slow (Posts, Orders, Media)Slow database query, often from a plugin adding columns or filtersQuery Monitor → Queries by component
Dashboard slow, other screens fineDashboard widgets fetching news or stats from other serversQuery Monitor → HTTP API calls
Slows down over the day with many editorsHeartbeat requests from open tabs, PHP workers exhaustedServer logs for admin-ajax.php, host's resource graphs
Saving a post takes secondsPlugins running on save_post: SEO analysis, cache purge, sitemap rebuildQuery Monitor on the save request
Slow after a plugin install or importNew autoloaded data or a large table without indexesAutoload size, database size

It helps to know whether the server is slow in general. The free TTFB test measures how long your server takes to answer a public page; if a cached public page is already slow, the host is part of the problem and the admin will be worse.

Step 1: Measure with Query Monitor and Site Health

Query Monitor is a free plugin that adds a panel to the admin bar. Open the slow screen and read, in this order:

  1. Overview: page generation time and peak memory. Over 1 second on a simple admin screen means something is wrong.
  2. Queries by component: which plugin or theme ran the most and slowest database queries. Sort by time.
  3. HTTP API calls: requests from your server to other servers during the page load. A dashboard widget or licence check that waits 2 seconds for a remote API adds 2 seconds to every load.
  4. Hooks and actions on a slow save, to see which plugin's code runs.

Query Monitor itself adds a little overhead; deactivate it when you are done.

Site Health (Tools → Site Health) checks the server and WordPress configuration. Look at the Status tab for "Autoloaded options could affect performance", "You should use a persistent object cache" and the PHP version, and at Info → Directories and sizes for the database size.

Step 2: Shrink autoloaded options

WordPress keeps settings in the wp_options table. Options marked for autoload are loaded in one query on every request, front end and admin. Plugins often store large data there, such as caches, logs or statistics, and some leave it behind when they are deleted. A few megabytes of autoloaded data slow down every single request and fill the object cache.

WordPress 6.6 improved this: options larger than 150 KB are no longer autoloaded by default when a plugin adds them without saying, and Site Health warns when the total autoloaded size exceeds 800 KB. Older data stays as it was.

Find the total and the biggest entries with SQL, in phpMyAdmin or wp db query. Replace wp_ with your table prefix:

SQL
-- total autoloaded size in KB (WordPress 6.6+ values)
SELECT ROUND(SUM(LENGTH(option_value)) / 1024) AS autoload_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto-on', 'auto');

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

For each large option:

  • From a plugin you deleted: remove it. The option name usually starts with the plugin's slug.
  • From an active plugin: check the plugin's settings for a log or cache you can clear, and ask its developer whether it needs to be autoloaded.
  • Needed, but not on every request: switch autoload off with wp_set_option_autoload( 'option_name', false ); (available since WordPress 6.4), or with SQL: UPDATE wp_options SET autoload = 'off' WHERE option_name = 'option_name';.

Back up the database before deleting anything, and change one option at a time. Never touch core options such as siteurl, home, active_plugins, cron or wp_user_roles.

Step 3: WordPress database optimization

A large database is not slow by itself, but some tables grow in ways that slow down the admin screens that query them.

Post revisions. WordPress keeps every saved revision of every post by default. A site with years of edits can have more revisions than posts. Limit new ones in wp-config.php:

PHP
// wp-config.php, above "That's all, stop editing!"
define( 'WP_POST_REVISIONS', 10 );

Delete old ones with WP-CLI, after a backup: wp post delete $(wp post list --post_type=revision --format=ids) --force. On very large sites, do it in batches.

Expired transients. Transients are temporary cached values stored in wp_options when there is no object cache. Expired ones should be cleaned up, but often are not. wp transient delete --expired removes them.

WooCommerce Action Scheduler. WooCommerce and many plugins use the Action Scheduler, which keeps completed and failed actions and their logs in wp_actionscheduler_actions and wp_actionscheduler_logs. Completed actions are purged after 30 days by default, but failed ones and busy stores can leave hundreds of thousands of rows. Check Tools → Scheduled Actions for failures, fix what fails, and see our guide to wp-cron and scheduled tasks for running the queue outside visitor requests.

Leftover tables. Deleted plugins often leave their tables behind. List them with wp db tables --all-tables and compare against your active plugins. Drop only tables you are sure belong to a removed plugin, after a backup.

Spam and trash. Empty spam comments and trashed posts, and shorten automatic emptying with define( 'EMPTY_TRASH_DAYS', 7 );.

After a clean-up, wp db optimize rebuilds the tables to reclaim space. Database optimisation plugins can do all of the above from a screen; whichever you use, schedule it monthly rather than running it continuously.

Step 4: Tame the WordPress Heartbeat API

The Heartbeat API keeps the admin in sync with the server. While an admin tab is open, the browser sends a request to admin-ajax.php at a regular interval: every 15 seconds in the post editor, for autosave and post locking, and every 60 seconds on other admin screens. Plugins hook into it for live notifications and dashboards.

One tab is harmless. Ten editors with five tabs each on a small hosting plan means a steady stream of uncached PHP requests, each loading all plugins and autoloaded options, competing for the same few PHP workers the admin needs. The symptom is an admin that gets slower during working hours.

What to do:

  • Close idle admin tabs. It is the cheapest fix.
  • Slow Heartbeat down outside the editor. The heartbeat_settings filter accepts intervals between 15 and 120 seconds:
PHP
// In a small custom plugin or your child theme's functions.php
add_filter( 'heartbeat_settings', function ( $settings ) {
    if ( ! is_admin() ) {
        return $settings;
    }
    global $pagenow;
    if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php' ), true ) ) {
        $settings['interval'] = 120;
    }
    return $settings;
} );
  • Leave it on in the post editor. Disabling Heartbeat there switches off autosave and the warning that another user is editing the same post.

Most caching and optimisation plugins have a Heartbeat setting that does the same without code. Use one method, not both.

Step 5: Find plugins that are heavy in the admin only

Some plugins cost almost nothing on the front end and a lot in the admin. The WordPress plugin detector cannot see them from outside, because they load nothing for visitors:

  • SEO plugins that analyse content on every edit and add columns to the post list.
  • Page builders loading their editor and templates library.
  • Backup and security scanners that run scans during admin requests instead of from cron.
  • Dashboard widgets from plugins and hosts that fetch news, stats or licence status from remote servers on every dashboard load.
  • Analytics dashboards that query large statistics tables or remote APIs.
  • WooCommerce admin with large order and analytics tables; High-Performance Order Storage, the default for new stores since WooCommerce 8.2, keeps orders in their own tables and makes order screens faster than the old post-based storage.

Query Monitor's component view names them. Then: turn off features you don't use (content analysis, dashboard widgets under Screen Options), schedule scans from cron, or replace the plugin. Our guide to what each WordPress plugin costs covers the front-end side of the same audit.

Step 6: Fix the server basics

  • PHP version. WordPress recommends PHP 8.3 or newer. Each major PHP release has made WordPress faster, and hosting panels switch versions in a click. Test on staging first.
  • OPcache. PHP's bytecode cache should be on; nearly every host enables it. Site Health's Info tab shows the PHP extensions loaded.
  • Persistent object cache. Redis or Memcached keeps database results in memory between requests. It helps the admin more than the front end, because the admin is never page-cached. Site Health recommends one when your host supports it; install the host's object cache plugin or a Redis object cache plugin.
  • PHP workers and memory. Plans with very few PHP workers queue admin requests behind each other. If Query Monitor shows fast page generation but the admin still feels slow, the wait is before PHP starts: that is the host. Our guides to server response time on shared hosting and choosing a WordPress host by measured TTFB help decide.

How to verify

  1. Note Query Monitor's page generation time and query count on three screens (Dashboard, Posts, one heavy screen such as Orders) before you start.
  2. Make one change at a time and re-measure the same screens, logged in, with the same number of tabs open.
  3. Check Site Health again: the autoload warning should be gone.
  4. After a week, ask editors whether saving and list screens feel faster during busy hours.

Common mistakes

  • Installing a "speed" plugin for the admin. Page caching does nothing for logged-in users; the admin needs the fixes above.
  • Disabling Heartbeat everywhere, which breaks autosave and post locking.
  • Deleting options or tables without a backup. A wrong row can take the site down.
  • Running a database optimiser on every page load or every hour. Monthly is enough.
  • Testing admin speed with Query Monitor left on in production for months.
  • Blaming WordPress core before checking plugins: on a default install with a default theme, the admin is fast.

Questions people ask

Why is my WordPress dashboard so slow but the website fast?

Because visitors get cached pages and you do not. The public site is served from a page cache in a fraction of a second, while every admin screen is built from scratch by PHP and the database, with all plugins and autoloaded options loaded. Heavy autoloaded options, a bloated database, Heartbeat requests and admin-only plugins all add to that. Query Monitor shows which one costs the most.

Should I disable the WordPress Heartbeat API?

Not completely. Heartbeat powers autosave, post locking and login expiry warnings in the editor, so turning it off there risks lost work and two people overwriting each other. Slow it to 60–120 seconds on other admin screens instead, with the heartbeat_settings filter or your optimisation plugin's setting, and close admin tabs you are not using.

How big should autoloaded options be in WordPress?

Under about 800 KB, which is the level at which Site Health has warned since WordPress 6.6, and well under that on a healthy site. Autoloaded options load on every request, front end and admin, so a few megabytes slow every page. Find the largest entries with a SQL query, delete those left by removed plugins, and switch off autoload for data that is not needed everywhere.

Does cleaning the database speed up WordPress?

It can, when specific tables have grown out of control: autoloaded options, hundreds of thousands of revisions, expired transients or Action Scheduler logs. Then admin screens and saves get noticeably faster. Removing a few thousand rows from a healthy database changes nothing you can measure. Measure with Query Monitor first, back up, clean the tables that are actually large, then measure again.

Check your site before and after Check