<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>sql-splitter - High-Performance SQL File Splitter in Rust</title>
<meta name="description" content="Split large SQL dump files into individual table files at 400+ MB/s. Memory-efficient, streaming architecture handles gigabyte-scale files. Written in Rust.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Monda:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
<div class="nav-content">
<a href="#" class="logo">
<span class="logo-icon">;</span>
sql-splitter
</a>
<div class="nav-links">
<a href="#install">Install</a>
<a href="#guide">Guide</a>
<a href="https://github.com/helgesverre/sql-splitter" target="_blank">GitHub</a>
</div>
</div>
</nav>
<main>
<section class="hero">
<h1>
<span class="logo-icon">;</span>
sql-splitter
</h1>
<p class="subtitle">Split SQL dumps at 400+ MB/s</p>
<p class="description">
High-performance CLI tool for splitting large SQL dump files into individual
table files. Supports MySQL, PostgreSQL, and SQLite. Written in Rust.
</p>
<div class="hero-actions">
<a href="#install" class="btn btn-primary">Get Started</a>
<a href="https://github.com/helgesverre/sql-splitter" class="btn btn-secondary" target="_blank">View on GitHub</a>
</div>
</section>
<section class="why">
<h2>Why sql-splitter?</h2>
<p class="lead">
Working with large SQL dumps is painful. Importing a 10GB file takes forever,
and you often just need a few tables. sql-splitter lets you split the dump
into individual files so you can import only what you need.
</p>
<div class="benefits">
<div class="benefit">
<div class="benefit-icon">~</div>
<h3>Blazing Fast</h3>
<p>400+ MB/s throughput</p>
</div>
<div class="benefit">
<div class="benefit-icon"><</div>
<h3>Memory Efficient</h3>
<p>~50MB constant usage</p>
</div>
<div class="benefit">
<div class="benefit-icon">*</div>
<h3>Zero-Copy</h3>
<p>No garbage collection</p>
</div>
</div>
</section>
<section class="quickstart">
<h2>Quick Start</h2>
<p class="lead">Split a SQL file in seconds.</p>
<div class="steps">
<div class="step">
<div class="step-number">1</div>
<div class="step-content">
<h3>Build from source</h3>
<div class="code-block">
<pre><code>git clone https://github.com/helgesverre/sql-splitter.git
cd sql-splitter
cargo build --release</code></pre>
<button class="copy-btn" data-copy="git clone https://github.com/helgesverre/sql-splitter.git && cd sql-splitter && cargo build --release">Copy</button>
</div>
</div>
</div>
<div class="step">
<div class="step-number">2</div>
<div class="step-content">
<h3>Split your dump</h3>
<div class="code-block">
<pre><code>./target/release/sql-splitter split database.sql --output=tables</code></pre>
<button class="copy-btn" data-copy="./target/release/sql-splitter split database.sql --output=tables">Copy</button>
</div>
</div>
</div>
</div>
<p class="note">That's it! Each table gets its own .sql file in the output directory.</p>
</section>
<section id="install" class="install">
<h2>Installation</h2>
<h3>From crates.io (Recommended)</h3>
<p>If you have Rust installed:</p>
<div class="code-block">
<pre><code>cargo install sql-splitter</code></pre>
<button class="copy-btn" data-copy="cargo install sql-splitter">Copy</button>
</div>
<h3>From GitHub</h3>
<div class="code-block">
<pre><code>cargo install --git https://github.com/helgesverre/sql-splitter</code></pre>
<button class="copy-btn" data-copy="cargo install --git https://github.com/helgesverre/sql-splitter">Copy</button>
</div>
<h3>Build from Source</h3>
<div class="code-block">
<pre><code>git clone https://github.com/helgesverre/sql-splitter.git
cd sql-splitter
cargo build --release
sudo cp target/release/sql-splitter /usr/local/bin/</code></pre>
<button class="copy-btn" data-copy="git clone https://github.com/helgesverre/sql-splitter.git
cd sql-splitter
cargo build --release
sudo cp target/release/sql-splitter /usr/local/bin/">Copy</button>
</div>
<h3>Optimized Build (Best Performance)</h3>
<p>Build with CPU-specific optimizations for maximum throughput:</p>
<div class="code-block">
<pre><code>RUSTFLAGS="-C target-cpu=native" cargo build --release</code></pre>
<button class="copy-btn" data-copy="RUSTFLAGS="-C target-cpu=native" cargo build --release">Copy</button>
</div>
<div class="verify">
<p>Verify installation:</p>
<div class="code-block">
<pre><code>sql-splitter --version</code></pre>
<button class="copy-btn" data-copy="sql-splitter --version">Copy</button>
</div>
</div>
</section>
<section id="guide" class="guide">
<h2>User Guide</h2>
<article class="guide-section">
<h3>Commands</h3>
<h4>split</h4>
<p>Split a SQL dump file into individual table files.</p>
<div class="code-block">
<pre><code># MySQL/MariaDB dump (default)
sql-splitter split database.sql --output=tables
# PostgreSQL pg_dump
sql-splitter split pg_dump.sql --output=tables --dialect=postgres
# SQLite dump
sql-splitter split sqlite.sql --output=tables --dialect=sqlite
# Split only specific tables
sql-splitter split database.sql --tables=users,posts
# Dry run (preview without writing)
sql-splitter split database.sql --dry-run --progress</code></pre>
<button class="copy-btn" data-copy="sql-splitter split database.sql --output=tables">Copy</button>
</div>
<h4>analyze</h4>
<p>Analyze a SQL file and display table statistics.</p>
<div class="code-block">
<pre><code>sql-splitter analyze database.sql
sql-splitter analyze database.sql --progress</code></pre>
<button class="copy-btn" data-copy="sql-splitter analyze database.sql">Copy</button>
</div>
</article>
<article class="guide-section">
<h3>Split Options</h3>
<table class="options-table">
<thead>
<tr><th>Flag</th><th>Short</th><th>Description</th><th>Default</th></tr>
</thead>
<tbody>
<tr><td><code>--output</code></td><td><code>-o</code></td><td>Output directory</td><td>output</td></tr>
<tr><td><code>--dialect</code></td><td><code>-d</code></td><td>SQL dialect (mysql, postgres, sqlite)</td><td>mysql</td></tr>
<tr><td><code>--tables</code></td><td><code>-t</code></td><td>Filter tables (comma-separated)</td><td>-</td></tr>
<tr><td><code>--progress</code></td><td><code>-p</code></td><td>Show progress</td><td>false</td></tr>
<tr><td><code>--dry-run</code></td><td>-</td><td>Preview without writing</td><td>false</td></tr>
</tbody>
</table>
</article>
<article class="guide-section">
<h3>Supported Statement Types</h3>
<p>sql-splitter recognizes and routes these SQL statement types to their respective table files:</p>
<div class="two-col">
<div>
<ul>
<li>CREATE TABLE</li>
<li>INSERT INTO</li>
<li>CREATE INDEX</li>
</ul>
</div>
<div>
<ul>
<li>ALTER TABLE</li>
<li>DROP TABLE</li>
</ul>
</div>
</div>
<p class="note">Other statements (SELECT, UPDATE, DELETE, etc.) are skipped.</p>
</article>
<article class="guide-section">
<h3>Examples</h3>
<h4>Split a large production dump</h4>
<div class="code-block">
<pre><code>sql-splitter split production-backup.sql -o tables -p</code></pre>
<button class="copy-btn" data-copy="sql-splitter split production-backup.sql -o tables -p">Copy</button>
</div>
<h4>Extract only specific tables</h4>
<div class="code-block">
<pre><code>sql-splitter split database.sql --tables=users,orders,products</code></pre>
<button class="copy-btn" data-copy="sql-splitter split database.sql --tables=users,orders,products">Copy</button>
</div>
<h4>Preview before splitting</h4>
<div class="code-block">
<pre><code>sql-splitter split database.sql --dry-run</code></pre>
<button class="copy-btn" data-copy="sql-splitter split database.sql --dry-run">Copy</button>
</div>
<h4>Analyze tables before splitting</h4>
<div class="code-block">
<pre><code>sql-splitter analyze database.sql</code></pre>
<button class="copy-btn" data-copy="sql-splitter analyze database.sql">Copy</button>
</div>
<h4>Import a single table</h4>
<div class="code-block">
<pre><code>mysql -u root -p mydb < tables/users.sql</code></pre>
<button class="copy-btn" data-copy="mysql -u root -p mydb < tables/users.sql">Copy</button>
</div>
</article>
<article class="guide-section">
<h3>Performance</h3>
<p>Benchmarks on Apple M2 Max:</p>
<table class="options-table">
<thead>
<tr><th>Metric</th><th>Value</th></tr>
</thead>
<tbody>
<tr><td>Parser Throughput</td><td>400-500 MB/s</td></tr>
<tr><td>vs Go Version</td><td>1.25x faster on 10GB files</td></tr>
<tr><td>Memory Usage</td><td>~50 MB constant</td></tr>
<tr><td>Cold Start</td><td>~5ms</td></tr>
</tbody>
</table>
<p class="note">Actual performance depends on disk I/O speed and file complexity.</p>
</article>
<article class="guide-section">
<h3>FAQ</h3>
<details>
<summary>Does it modify my source file?</summary>
<div class="details-content">
<p>No. sql-splitter only reads from your source file. It never modifies the original.</p>
</div>
</details>
<details>
<summary>What about statements with semicolons in strings?</summary>
<div class="details-content">
<p>sql-splitter correctly handles semicolons inside quoted strings. It tracks quote boundaries and escape sequences.</p>
</div>
</details>
<details>
<summary>Can it handle multi-line statements?</summary>
<div class="details-content">
<p>Yes. The parser uses streaming and statement boundary detection, not line-based parsing.</p>
</div>
</details>
<details>
<summary>What about backtick-quoted table names?</summary>
<div class="details-content">
<p>Both backtick-quoted (<code>`table`</code>) and regular table names are supported.</p>
</div>
</details>
<details>
<summary>Why Rust instead of Go?</summary>
<div class="details-content">
<p>Rust's zero-cost abstractions and lack of garbage collection enable higher throughput. The Rust version achieves 1.25x faster performance than Go on large files, with lower memory usage and faster cold starts.</p>
</div>
</details>
<details>
<summary>Is it faster than other tools?</summary>
<div class="details-content">
<p>sql-splitter is among the fastest SQL splitters available, achieving 400+ MB/s throughput with minimal memory footprint thanks to Rust's ownership model and zero-copy parsing.</p>
</div>
</details>
</article>
</section>
</main>
<footer>
<p>
<a href="https://github.com/helgesverre/sql-splitter">GitHub</a>
<span class="sep">|</span>
<a href="https://github.com/helgesverre/sql-splitter/releases">Releases</a>
<span class="sep">|</span>
<a href="https://github.com/helgesverre/sql-splitter/blob/main/LICENSE">MIT License</a>
<span class="sep">|</span>
<a href="llms.txt">llms.txt</a>
</p>
<p class="credit">Built by <a href="https://github.com/helgesverre">Helge Sverre</a></p>
</footer>
<script>
document.querySelectorAll('.copy-btn').forEach(btn => {
btn.addEventListener('click', async () => {
const text = btn.dataset.copy;
try {
await navigator.clipboard.writeText(text);
const original = btn.textContent;
btn.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => {
btn.textContent = original;
btn.classList.remove('copied');
}, 2000);
} catch (err) {
btn.textContent = 'Failed';
setTimeout(() => btn.textContent = 'Copy', 2000);
}
});
});
</script>
</body>
</html>