Learn MySQL
Practical guides for developers building on VillageSQL
MySQL Indexes
How to speed up queries with the right index strategy
JSON in MySQL
Store, query, and manipulate JSON documents natively
Window Functions
Running totals, rankings, and moving averages
Primary Key Strategies
Auto-increment, UUIDs, and when to use each
Password Hashing
Bcrypt and Argon2 for secure credential storage
Postgres to MySQL
A practical migration guide for common patterns
MySQL on Docker
Run MySQL in containers for local and production
Stored Procedures
Encapsulate and reuse SQL logic in the database
Joins
How to combine rows from multiple tables with INNER, LEFT, and other JOINs
Transactions
Keep your data consistent with ACID-compliant transactions
CTEs in MySQL
Write readable, recursive queries with common table expressions
Slow Query Log
Find and fix the queries slowing down your database
From the blog
Announcing VillageSQL Server 0.0.5
VillageSQL Server 0.0.5 is now available (and marked as the stable release for installs). This relea...
Village News: Village News: MySQL News + Events (1 July 2026)
As part of building the MySQL Community, we are going to publish a curated overview of MySQL and dat...
MySQL's New Governance Model: Two steps forward, one step to the side, and one step backwards
After years of MySQL development happening largely behind closed doors, Oracle has been making real ...
Fuzzy String Search for MySQL
MySQL's string matching is precise by design. LIKE '%shirt%' finds "shirt." It won't find "shrt" or ...
Village News: MySQL News + Events (11 June 2026)
As part of building the MySQL Community, we are going to publish a curated overview of MySQL and dat...
Your MySQL Schema is Already a REST API
You have a table. You need to serve it over HTTP. The standard path requires you to write a service ...
Village News: MySQL/Database News + Events (5 June 2026)
As part of building the MySQL Community, we are going to publish a curated overview of MySQL and dat...
Happy Path, Escape Hatch, and the Space Between
When you design an extensibility API, you face a tension: make it easy, or make it powerful? We thin...