Accelerating Local Development with Laravel Migration Squashing

Laravel////3 min read

Overview of Migration Squashing

As a Laravel 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, Laravel 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.

Topic DensityMention share of the most discussed topics · 10 mentions across 5 distinct topics
Laravel
60%· products
MySQL
10%· products
PHP
10%· products
PostgreSQL
10%· products
Taylor Otwell
10%· people
End of Article
Source video
Accelerating Local Development with Laravel Migration Squashing

Laravel Gems - Squash Migrations 💎

Watch

Laravel // 3:40

The official YouTube channel of Laravel, the clean stack for Artisans and agents. We will update you on what's new in the world of Laravel, from the framework to our products Cloud, Forge, and Nightwatch.

3 min read0%
3 min read