MySQL vacuum FAQ: How do I vacuum a MySQL database table, or an entire MySQL database?
Discussion (MySQL VACUUM == OPTIMIZE TABLES)
This may be an unusual situation, but as I'm creating a new application that uses a MySQL database, I've found that I want a "MySQL vacuum" operation; I want to reset all my MySQL auto_increment counters back to 1 without having to completely drop and then re-create my MySQL database.
Specifically what I'm doing is this:
- Running approximately 10,000 inserts against some of my MySQL database tables.
- Finding bugs in my programs and approach.
- Dropping my MySQL database tables (without dropping the database).
- Recreating my database tables (basically using "drop table if exists foo" followed by "create table foo").
- Going back to Step 1.
As I do this, my MySQL auto_increment counters are constantly increasing; first they start at 1, then 10,001, then 20,001, etc. This is isn't a huge problem in development mode, but it is annoying. I thought there was a MySQL VACUUM operator, but there isn't. Instead there is a MySQL OPTIMIZE TABLES command.
A MySQL vacuum script (MySQL auto_increment reset script)
So, to reset the MySQL auto_increment counter back to 1, I finally stumbled on the following technique, which I just tested, and does indeed set all the auto_increment counters back to 1.
<?php
# NAME: VacuumMysqlDatabase.php
# DEVELOPER: Alvin Alexander, http://devdaily.com
# COPYRIGHT:
# LICENSE: Copyright 2010, Alvin Alexander.
# This software is released under the terms of the
# Creative Commons Share-Alike License. See the following
# URL for more information:
# http://creativecommons.org/licenses/by-sa/3.0/
# database parameters
$db_host = 'localhost';
$db_user = 'root';
$db_pass = 'root';
$db_dbname = 'codeme';
# show all errors right now
error_reporting(E_ALL);
ini_set("display_errors", 'On');
# connect to database
$link = mysql_connect($db_host, $db_user, $db_pass);
if (!$link)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db ($db_dbname);
# vacuum all the mysql tables
$alltables = mysql_query("SHOW TABLES");
while ($table = mysql_fetch_assoc($alltables))
{
foreach ($table as $db => $tablename)
{
mysql_query("OPTIMIZE TABLE $tablename") or die(mysql_error());
}
}
# need root access (or similar) to run this command
mysql_query("FLUSH TABLES") or die(mysql_error());
?>
My MySQL Vacuum tables script - Summary
I'm not going to explain this script much, other than to say that in my MySQL database, it does the "vacuum" stuff I mentioned, setting the MySQL auto_increment counter back to 1. So, I hope this MySQL vacuum script is helpful for you.

