Accelerating Local Development with Laravel Migration Squashing

Overview of Migration Squashing

As a

application grows, the database/migrations directory often becomes a cluttered timeline of every architectural decision ever made. In large-scale projects, it is common to see 500 or 600 individual migration files. This accumulation creates a performance bottleneck during local development and automated testing. Every time you run a fresh migration, the framework must boot up, execute, and record each file individually. Migration squashing solves this by condensing your entire database history into a single, high-performance SQL file, significantly reducing the overhead of environment setup.

Prerequisites

To implement this technique, you should be comfortable with:

  • PHP
    and basic
    Laravel
    directory structures.
  • Running commands via the terminal.
  • Database management concepts like schemas and migrations.
  • A supported database engine like
    MySQL
    or
    PostgreSQL
    .

Key Libraries & Tools

  • Laravel Artisan: The command-line interface included with
    Laravel
    that handles schema operations.
  • Laravel Benchmark Facade: A utility used to measure the execution time of code blocks, helpful for identifying performance gains.
  • Database Schema Dump: The specific Artisan feature that exports the current database state into a raw SQL schema file.

The Squashing Walkthrough

First, assess the current performance using the Benchmark facade. In a large project, running 500 migrations might take approximately 4 seconds.

Benchmark::run(fn () => Artisan::call('migrate:fresh'));

To squash these migrations, execute the following command in your terminal:

php artisan schema:dump

This command creates a new directory at database/schema containing a file named mysql-schema.sql (the prefix matches your database connection). This file contains the raw SQL required to recreate your entire table structure.

When you next run php artisan migrate,

detects this schema file. Instead of iterating through hundreds of individual PHP migration files, it executes the single SQL dump first. Performance benchmarks show this can reduce migration time from 4 seconds down to 2.5 seconds—a massive cumulative win for CI/CD pipelines and test suites.

Syntax and Usage Notes

  • Schema Loading:
    Laravel
    only loads the schema file if the database is empty and no migrations have been recorded.
  • Incremental Changes: You do not need to re-dump every time you create a new migration.
    Laravel
    will load the schema file first, then run any "new" migrations that aren't yet part of that dump.
  • Cleaning Up: Once you have a schema dump, you can safely delete the old migration files from your directory to clean up your version control history.

Tips & Gotchas

Avoid manual edits to the generated SQL schema file, as it is managed by the framework. If you need to make changes, create a new migration as usual. If you use multiple database connections, remember that schema:dump only targets your default connection unless you specify otherwise with the --database flag. Always commit your schema dump to your repository so your teammates and CI servers benefit from the performance boost.

3 min read