Skip to main content

wp db optimize

Overview

Defragment and compact WordPress database tables to reclaim disk space from deleted rows and improve query performance. Run after bulk deletions, large imports, or as part of regular maintenance.

What It Does

wp db optimize runs mysqlcheck --optimize on all WordPress tables. For MyISAM tables, this defragments the data file. For InnoDB tables, it performs an ALTER TABLE ... ENGINE=InnoDB rebuild (equivalent to OPTIMIZE TABLE), which:

  • Reclaims space from deleted/updated rows
  • Rebuilds indexes
  • Updates table statistics for the query optimizer

Syntax

wp db optimize [--dbuser=<value>] [--dbpass=<value>]

Options & Flags

FlagDescription
--dbuser=VALUEOverride DB user
--dbpass=VALUEOverride DB password

Basic Usage

Optimize all tables

wp db optimize

Output:

Success: Database optimized.

When to Run

TriggerRecommended Action
After deleting many postswp db optimize
After purging spam commentswp db optimize
After bulk plugin/theme cleanupwp db optimize
After wp db import on large dumpwp db optimize
Monthly scheduled maintenancewp db optimize

Real-World Scenarios

Scenario 1: Post-cleanup optimization

# Delete spam comments
wp comment delete $(wp comment list --status=spam --format=ids) --force

# Delete post revisions
wp post delete $(wp post list --post_type=revision --format=ids) --force

# Optimize after bulk deletion
wp db optimize
wp db size --size_format=mb

Scenario 2: Monthly maintenance script

#!/bin/bash
echo "=== Monthly DB Maintenance: $(date) ==="

# Delete transients
wp transient delete --expired

# Delete spam comments
wp comment delete $(wp comment list --status=spam --format=ids 2>/dev/null) --force 2>/dev/null || true

# Optimize
wp db optimize

# Report size
echo "DB size after optimization:"
wp db size --size_format=mb

Scenario 3: Size comparison before and after

echo "Before:"
wp db size --size_format=mb

wp db optimize

echo "After:"
wp db size --size_format=mb

Best Practices

  1. Never skip wp db optimize after bulk deletions — deleted rows leave fragmented space.
  2. Run during low-traffic hours — InnoDB optimization rebuilds tables and can be slow on large tables.
  3. Combine with transient cleanuptransient delete --expired reduces wp_options bloat before optimizing.
  4. Schedule monthly via cron as part of regular DB maintenance.

Troubleshooting

ProblemCauseFix
InnoDB table shows note: recreate + analyze insteadExpected — InnoDB doesn't defrag the same as MyISAMThis is normal; space is still reclaimed
Command is slowLarge tables being rebuiltRun during off-peak hours
Access deniedDB user lacks LOCK TABLES or ALTER privilegeUse root or grant privileges

Quick Reference

wp db optimize                          # Optimize all tables
wp db size --size_format=mb # Check size before/after
wp db repair # Repair before optimizing (if needed)

Next Steps