Skip to content

Storage Backends

This page covers backend comparison, limitations, and backend-specific configuration examples.

Storage Backend Comparison

FeatureSQLitePostgreSQLMySQLMariaDB
Basic Features
Create Short Links
Get Short Links
Delete Short Links
Batch Import
Advanced Features
Click Counting
Click Statistics Query
Expiration Time
Auto Expiration Cleanup
UTF-8/Emoji Support
Performance Features
Concurrent Reads✅ Multi-read✅ Multi-read✅ Multi-read✅ Multi-read
Concurrent Writes⚠️ Single-write✅ Multi-write✅ Multi-write✅ Multi-write
Transaction Support✅ ACID✅ ACID✅ ACID✅ ACID
Connection Pool
Operations Features
Hot Backup✅ File copy✅ pg_dump✅ mysqldump✅ mariadb-dump
Incremental Backup✅ WAL✅ binlog✅ binlog
Online Scaling
Cluster Support

Storage Backend Limitations

SQLite Limitations

Concurrency Limitations:

  • ✅ Supports multiple concurrent reads
  • ⚠️ Only supports single write operation (slightly improved in WAL mode)
  • ⚠️ Writes temporarily block reads

Capacity Limitations:

  • ✅ Single table theoretical limit: 281TB
  • ✅ Practical recommendation: < 100GB, < 10 million records
  • ✅ Automatic index optimization

Click Counting:

  • ✅ Supports real-time click counting
  • ✅ Batch refresh mechanism reduces lock contention
  • ⚠️ High-frequency clicks may affect write performance

Other Limitations:

  • ❌ No network access support
  • ❌ No user permission management
  • ❌ No horizontal scaling support

PostgreSQL Limitations

Performance Limitations:

  • ✅ Theoretically unlimited capacity
  • ✅ Supports hundreds of thousands of QPS
  • ✅ Supports complex queries and analysis

Click Counting:

  • ✅ High-performance concurrent click counting
  • ✅ Supports real-time statistics queries
  • ✅ Supports time-period statistics

Operations Requirements:

  • ⚠️ Requires professional DBA maintenance
  • ⚠️ High memory consumption (recommended >= 1GB)
  • ⚠️ Requires regular VACUUM cleanup

MySQL/MariaDB Limitations

Storage Limitations:

  • ✅ InnoDB engine: theoretical 256TB
  • ✅ Supports table partitioning and sharding
  • ✅ Mature cluster solutions

Click Counting:

  • ✅ High-performance click counting
  • ✅ Supports triggers and stored procedures
  • ✅ Rich statistical query capabilities

Character Set Notes:

  • ✅ Uses utf8mb4 by default for full emoji support
  • ⚠️ Older versions may require manual character set configuration

Database Backend Configuration

SQLite Database Storage (Default)

Features:

  • ✅ Zero configuration, works out of the box
  • ✅ ACID transaction guarantee
  • ✅ High-performance local queries
  • ✅ Automatic index optimization
  • ✅ File-level backup
  • ⚠️ Single-write concurrency limitation

Configuration Examples:

toml
# config.toml
[database]
# Relative path
# database_url = "sqlite://./shortlinks.db"
database_url = "sqlite://./data/shortlinks.db"

# Absolute path
# database_url = "sqlite:///var/lib/shortlinker/shortlinks.db"

# In-memory database (testing)
# database_url = ":memory:"

Use Cases:

  • Single-machine deployment
  • Medium scale (< 100,000 links)
  • Quick startup and prototyping

PostgreSQL Database Storage

Features:

  • ✅ Enterprise-grade reliability
  • ✅ High concurrency multi-read multi-write
  • ✅ Powerful JSON support
  • ✅ Rich index types
  • ✅ Horizontal scaling support
  • ✅ Mature monitoring ecosystem

Configuration Examples:

toml
# config.toml
[database]
# Standard connection URL
database_url = "postgres://user:password@localhost:5432/shortlinker"
# database_url = "postgresql://user:password@localhost:5432/shortlinker"

# Production environment example
# database_url = "postgresql://shortlinker:secure_password@db.example.com:5432/shortlinker_prod?sslmode=require"

Docker Quick Start:

bash
docker run --name postgres-shortlinker \
  -e POSTGRES_DB=shortlinker \
  -e POSTGRES_USER=shortlinker \
  -e POSTGRES_PASSWORD=your_password \
  -p 5432:5432 -d postgres:15

Use Cases:

  • Enterprise production environments
  • High concurrency access (1000+ QPS)
  • Large-scale data (millions of links)
  • Complex queries and analysis requirements

MySQL Database Storage

Features:

  • ✅ Wide ecosystem support
  • ✅ Mature operations tools
  • ✅ High concurrent read-write performance
  • ✅ Rich engine choices (InnoDB)
  • ✅ Complete backup and recovery solutions
  • ✅ Full UTF-8 support

Configuration Examples:

toml
# config.toml
[database]
# Standard connection URL
database_url = "mysql://user:password@localhost:3306/shortlinker"

# Production environment example
# database_url = "mysql://shortlinker:secure_password@mysql.example.com:3306/shortlinker_prod"

Docker Quick Start:

bash
docker run --name mysql-shortlinker \
  -e MYSQL_DATABASE=shortlinker \
  -e MYSQL_USER=shortlinker \
  -e MYSQL_PASSWORD=your_password \
  -e MYSQL_ROOT_PASSWORD=root_password \
  -p 3306:3306 -d mysql:8.0

Use Cases:

  • Traditional enterprise environments
  • Existing MySQL infrastructure
  • Integration with existing MySQL applications

MariaDB Database Storage

Features:

  • ✅ 100% MySQL compatible
  • ✅ Open source friendly license
  • ✅ Faster query optimizer
  • ✅ Enhanced JSON support
  • ✅ Better performance monitoring
  • ✅ Active community support

Configuration Examples:

toml
# config.toml
[database]
# MariaDB uses mariadb:// scheme (handled as MySQL protocol)
database_url = "mariadb://user:password@localhost:3306/shortlinker"

# Also supports mysql:// scheme (backward compatible)
# database_url = "mysql://shortlinker:secure_password@mariadb.example.com:3306/shortlinker_prod"

Docker Quick Start:

bash
docker run --name mariadb-shortlinker \
  -e MARIADB_DATABASE=shortlinker \
  -e MARIADB_USER=shortlinker \
  -e MARIADB_PASSWORD=your_password \
  -e MARIADB_ROOT_PASSWORD=root_password \
  -p 3306:3306 -d mariadb:11.1

Use Cases:

  • Open source priority environments
  • Modern MySQL alternative
  • Better performance and open source licensing needs

Released under the MIT License