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
Village News: MySQL News + Events (1 October 2026)
Welcome back to Village News, our curated roundup of MySQL and database news. If you want to get the...
Access MySQL over MCP with vsql-mcp
The Model Context Protocol (MCP) has become a standard way for AI agents to discover the tools an ap...
Village News: MySQL News + Events (21 September 2026)
Welcome back. This issue covers five weeks rather than the usual one — the gap since the August issu...
Using DuckDB inside MySQL
A duck, a dolphin, and a pelican walk into a bar...
Vector search in MySQL: an early look at HNSW and custom indexes in VillageSQL
MySQL 9.x added the VECTOR data type so you can store an embedding. You get a VECTOR column, functio...
Advanced Cryptography in MySQL with vsql-crypto
There are a few cryptography tasks that are common to many backends. For example, you should store p...
OAuth2 and JWT Logins for MySQL
An engineer leaves your company. You disable their single sign-on account, and their access to the w...
Announcing VillageSQL Server 0.0.6
VillageSQL Server 0.0.6 is now available. This release advances the mainline to MySQL Server 8.4.11 ...