Subscribe to Our Mailing List and Stay Up-to-Date!
Subscribe
WordPress Performance

WordPress Database Optimization Before Backups: Speed and Size Reduction

A bloated WordPress database slows everything down—backups take forever to create, cloud uploads time out, and restoration drags on for 30+ minutes when you need your site back online immediately. Worse, you’re paying for cloud storage to backup spam comments, post revisions you’ll never use, and expired transients that serve no purpose.

Database optimization isn’t just about site performance—it directly impacts backup efficiency. This comprehensive guide teaches you how to identify and eliminate database bloat, reducing backup sizes by 30-70% while dramatically improving backup and restore speeds.

By the end of this tutorial, you’ll know exactly what’s consuming database space, which tables are safe to clean, and how to implement automated optimization that keeps your database lean and your backups fast.

Why Database Optimization Matters for Backups

Impact on Backup Performance

Before Optimization:

  • Database size: 500 MB
  • Backup creation time: 8 minutes
  • Cloud upload time: 15 minutes
  • Total backup time: 23 minutes

After Optimization:

  • Database size: 150 MB (70% reduction)
  • Backup creation time: 2 minutes
  • Cloud upload time: 4 minutes
  • Total backup time: 6 minutes

That’s 4x faster backups from simple cleanup.

Storage Cost Savings

Example E-Commerce Site:

Before optimization:

  • Database: 2 GB per backup
  • Retention: 30 daily backups
  • Total storage: 60 GB
  • Cloud cost (Dropbox): $11.99/month (2 TB plan)

After optimization:

  • Database: 400 MB per backup
  • Retention: 30 daily backups
  • Total storage: 12 GB
  • Cloud cost (Google Drive): $1.99/month (100 GB plan)

Savings: $10/month = $120/year

Faster Disaster Recovery

When your site crashes, every minute counts:

  • 150 MB database: 3 minutes to download + import
  • 500 MB database: 12 minutes to download + import

Optimized database = 4x faster recovery

Identifying Database Bloat

Check Total Database Size

Via phpMyAdmin:

  1. Log into phpMyAdmin
  2. Click database name in left sidebar
  3. Bottom of page shows “Database: database_name (X MB)”

Via MySQL Command:

SELECT
    table_schema AS 'Database',
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
GROUP BY table_schema;

Typical WordPress Database Sizes:

  • Fresh WordPress install: ~1 MB
  • Small blog (50 posts): 5-15 MB
  • Business site (200 pages): 20-50 MB
  • E-commerce (1000 products): 50-200 MB
  • Large site (5000+ posts): 200-500 MB

If your site is small but database is large (100+ MB), significant bloat exists.

Table-by-Table Analysis

Find largest tables:

SELECT
    table_name AS 'Table',
    ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_database_name'
ORDER BY (data_length + index_length) DESC
LIMIT 10;

Common bloat culprits:

  • wp_postmeta – Oversized from revisions
  • wp_options – Transients and autoload bloat
  • wp_comments – Spam comments
  • wp_commentmeta – Orphaned comment metadata
  • Plugin tables – Logs, analytics, caches

Specific Bloat Queries

Count post revisions:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';

More than 1,000? Time to clean.

Count spam comments:

SELECT COUNT(*) FROM wp_comments WHERE comment_approved = 'spam';

Count expired transients:

SELECT COUNT(*)
FROM wp_options
WHERE option_name LIKE '_transient_timeout_%'
  AND option_value < UNIX_TIMESTAMP();

Count autoloaded data:

SELECT SUM(LENGTH(option_value)) / 1024 as 'Autoload Size (KB)'
FROM wp_options
WHERE autoload = 'yes';

Over 1 MB (1024 KB) autoloaded = performance issue.

Safe Database Cleanup Methods

1. Remove Post Revisions

Post revisions accumulate quickly:

  • 100 posts × 10 revisions each = 1,000 extra posts
  • Each revision duplicates content, increasing database size

Limit future revisions in wp-config.php:

// Limit to 3 revisions per post
define('WP_POST_REVISIONS', 3);

// Or disable revisions completely
define('WP_POST_REVISIONS', false);

Delete old revisions (keep last 3):

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'
  AND a.ID NOT IN (
    SELECT ID FROM (
      SELECT p.ID
      FROM wp_posts p
      WHERE p.post_type = 'revision'
      ORDER BY p.post_modified DESC
      LIMIT 3
    ) AS keep_revisions
  );

Use WP-CLI (safer):

wp post delete $(wp post list --post_type='revision' --format=ids) --force

Impact: Can reduce database size by 20-40% for content-heavy sites.

2. Clean Auto-Drafts

Auto-drafts = unpublished drafts saved automatically:

Delete auto-drafts older than 30 days:

DELETE FROM wp_posts
WHERE post_status = 'auto-draft'
  AND post_modified < DATE_SUB(NOW(), INTERVAL 30 DAY);

Via WP-CLI:

wp post delete $(wp post list --post_status=auto-draft --format=ids) --force

3. Remove Spam and Trashed Comments

Spam comments accumulate in database even after marking as spam:

Delete spam comments:

DELETE FROM wp_comments WHERE comment_approved = 'spam';

Delete trashed comments:

DELETE FROM wp_comments WHERE comment_approved = 'trash';

Delete orphaned comment metadata:

DELETE FROM wp_commentmeta
WHERE comment_id NOT IN (SELECT comment_id FROM wp_comments);

WP-CLI method:

wp comment delete $(wp comment list --status=spam --format=ids) --force
wp comment delete $(wp comment list --status=trash --format=ids) --force

Impact: Reduces database 5-15% for sites with active comments.

4. Clean Expired Transients

Transients = temporary cached data:

  • API responses cached for 12 hours
  • Widget output cached for 24 hours
  • Plugin settings cached temporarily

Problem: Expired transients remain in database.

Delete expired transients:

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

DELETE FROM wp_options
WHERE option_name LIKE '_transient_%'
  AND option_name NOT LIKE '_transient_timeout_%'
  AND option_name NOT IN (
    SELECT REPLACE(option_name, '_transient_timeout_', '_transient_')
    FROM wp_options
    WHERE option_name LIKE '_transient_timeout_%'
  );

Simpler plugin method: Install Transient Cleaner plugin, click “Clean Transients.”

Impact: Reduces wp_options table by 10-30% for sites with many plugins.

5. Remove Orphaned Post Metadata

Orphaned postmeta = metadata for deleted posts:

Find orphaned postmeta:

SELECT COUNT(*)
FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts);

Delete orphaned postmeta:

DELETE FROM wp_postmeta
WHERE post_id NOT IN (SELECT ID FROM wp_posts);

Impact: Can recover 5-10 MB in moderately sized databases.

6. Optimize Autoloaded Options

Autoload = data loaded on every page request:

View largest autoloaded options:

SELECT
    option_name,
    LENGTH(option_value) AS 'Size (bytes)',
    ROUND(LENGTH(option_value) / 1024, 2) AS 'Size (KB)'
FROM wp_options
WHERE autoload = 'yes'
ORDER BY LENGTH(option_value) DESC
LIMIT 20;

Disable autoload for large, infrequently-used options:

UPDATE wp_options
SET autoload = 'no'
WHERE option_name = 'large_option_name'
  AND LENGTH(option_value) > 50000;

Warning: Only disable autoload if you understand what the option does. Some options must be autoloaded.

Impact: Improves site performance, minimal database size reduction.

Using Optimization Plugins

Features:

  • Clean revisions, drafts, spam with one click
  • Schedule automatic weekly optimization
  • Table optimization (OPTIMIZE TABLE)
  • Image compression (premium)
  • Safe and actively maintained

Installation:

  1. Plugins > Add New > Search “WP-Optimize”
  2. Install and activate
  3. WP-Optimize > Database tab
  4. Check desired cleanup actions
  5. Click “Run optimization”

Recommended settings:

  • Clean post revisions: Yes
  • Clean auto-drafts: Yes
  • Clean spam/trashed comments: Yes
  • Clean expired transients: Yes
  • Optimize tables: Yes
  • Schedule: Weekly

Advanced Database Cleaner

Features:

  • Clean orphaned data from deleted plugins
  • Remove unused tables
  • Optimize and repair tables
  • Schedule cleanups

Best for: Sites that install/uninstall many plugins (leaves orphaned tables).

WP-Sweep

Features:

  • Similar to WP-Optimize
  • Detailed statistics before cleanup
  • Integrates with WP-CLI

Use if: You want detailed preview before cleanup.

Manual Database Optimization

OPTIMIZE TABLE Command

What it does:

  • Reclaims unused space
  • Defragments table data
  • Rebuilds indexes
  • Improves query performance

Optimize all WordPress tables:

OPTIMIZE TABLE
    wp_posts,
    wp_postmeta,
    wp_options,
    wp_comments,
    wp_commentmeta,
    wp_users,
    wp_usermeta,
    wp_terms,
    wp_term_taxonomy,
    wp_term_relationships,
    wp_termmeta;

Via phpMyAdmin:

  1. Select database
  2. Check all tables
  3. Bottom dropdown: “Optimize table”
  4. Click “Go”

WP-CLI method:

wp db optimize

Frequency: Monthly for active sites, quarterly for static sites.

Impact: Recovers 5-15% disk space from fragmentation.

Repair and Optimize Combined

For MyISAM tables (older WordPress):

mysqlcheck -u username -p --auto-repair --optimize database_name

Benefits:

  • Fixes minor corruption
  • Optimizes simultaneously
  • Safe to run regularly

Automated Optimization Strategies

Schedule Regular Cleanups

WP-Optimize built-in scheduler:

  1. WP-Optimize > Settings tab
  2. Enable “Schedule cleanups”
  3. Choose frequency: Weekly recommended
  4. Select cleanup tasks
  5. Save settings

WP-CLI cron job:

# Add to server crontab
0 3 * * 0 /usr/bin/wp db optimize --path=/path/to/wordpress

Runs every Sunday at 3 AM.

Pre-Backup Optimization Hook

Optimize database before each automated backup:

Create plugin or add to functions.php:

add_action('before_backup_creation', 'optimize_database_before_backup');

function optimize_database_before_backup() {
    global $wpdb;

    // Get all WordPress tables
    $tables = $wpdb->get_col("SHOW TABLES LIKE '{$wpdb->prefix}%'");

    foreach ($tables as $table) {
        $wpdb->query("OPTIMIZE TABLE {$table}");
    }
}

Ensures every backup is of optimized database.

Plugin-Specific Cleanup

WooCommerce order cleanup:

Delete old completed orders (keep 1 year):

DELETE posts, postmeta
FROM wp_posts posts
LEFT JOIN wp_postmeta postmeta ON posts.ID = postmeta.post_id
WHERE posts.post_type = 'shop_order'
  AND posts.post_status = 'wc-completed'
  AND posts.post_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);

Warning: Only if certain you don’t need old order records for accounting/tax purposes.

Measuring Optimization Results

Before/After Comparison

Before optimization, record:

-- Total database size
SELECT SUM(data_length + index_length) / 1024 / 1024 AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'your_database';

-- Row counts
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'revision';
SELECT COUNT(*) FROM wp_comments WHERE comment_approved = 'spam';
SELECT COUNT(*) FROM wp_options WHERE option_name LIKE '_transient_%';

After optimization, compare:

  • Database size reduction (MB)
  • Revision count reduction
  • Spam comment removal
  • Transient cleanup

Example results:

Before: 450 MB database, 5,200 revisions, 12,000 spam comments
After: 180 MB database, 300 revisions, 0 spam comments
Reduction: 60% size reduction, 270 MB saved

Backup Time Improvement

Test backup before and after:

Before optimization:

Start: 3:00:00 AM
Finish: 3:12:45 AM
Duration: 12 minutes 45 seconds
File size: 450 MB

After optimization:

Start: 3:00:00 AM
Finish: 3:04:20 AM
Duration: 4 minutes 20 seconds
File size: 180 MB

Improvement: 66% faster backups, 60% smaller files

Best Practices and Warnings

Safety Precautions

Always backup before optimization:

  1. Create full database backup
  2. Download backup locally
  3. Verify backup file size reasonable
  4. Then run optimization
  5. If something breaks, restore from backup

Test on staging first:

  • Clone site to staging environment
  • Run optimization on staging
  • Verify site functions correctly
  • Then optimize production

Never run unknown SQL:

  • Don’t copy/paste SQL from untrusted sources
  • Understand what each query does
  • Test on small subset first
  • Have backup before executing

What NOT to Clean

Do NOT delete:

  • wp_options with autoload=’yes’ (unless you know what it is)
  • wp_users or wp_usermeta (breaks user accounts)
  • wp_posts with post_status=’publish’ (deletes published content)
  • Custom plugin tables without understanding purpose
  • Any table if unsure what it does

When in doubt, keep it.

Optimization Frequency

Recommended schedule:

Site TypeOptimization Frequency
Personal blogQuarterly (every 3 months)
Business siteMonthly
E-commerceWeekly
High-trafficWeekly
MembershipBi-weekly

Before major events:

  • Before site redesign
  • Before migration
  • Before Black Friday (e-commerce)
  • Before product launch

Real-World Optimization Example

Site: Food blog with 500 posts, 3 years old

Initial stats:

  • Database size: 680 MB
  • Backup time: 18 minutes
  • Revisions: 8,200
  • Spam comments: 24,000
  • Expired transients: 1,500

Optimization steps:

  1. Limited revisions to 3 per post
  2. Deleted old revisions (kept last 3)
  3. Deleted all spam comments
  4. Cleaned expired transients
  5. Removed orphaned postmeta
  6. Optimized all tables

Results:

  • Database size: 195 MB (71% reduction)
  • Backup time: 5 minutes (72% faster)
  • Revisions: 600 (kept recent ones)
  • Spam comments: 0
  • Expired transients: 0

Ongoing maintenance:

  • WP-Optimize scheduled weekly
  • Revisions limited to 3 in wp-config.php
  • Akismet blocks spam (auto-delete after 15 days)

Annual savings:

  • Cloud storage downgraded: $60/year saved
  • Backup time saved: 13 minutes × 365 days = 79 hours/year
  • Faster site performance: Priceless
  1. WordPress Database Optimization
  2. MySQL OPTIMIZE TABLE
  3. WP-Optimize Plugin
  4. Understanding WordPress Transients
  5. Database Performance Best Practices

Cleaner databases, faster backups! Backup Copilot Pro backs up optimized databases efficiently with smart compression. Reduce storage costs and improve restore times—start optimizing today!