When the MySQL optimizer guesses wrong by a factor of a thousand, plans collapse. Column histograms fix skewed, non-indexed estimates, if you know when they are ignored.
Database Topic Archive
MySQL Articles
InnoDB internals, replication, locking, query performance, and MySQL operations notes.
ALGORITHM=INSTANT finishes in milliseconds; INPLACE rewrites every row; COPY blocks writers. The 64 row-version limit, metadata locks, progress monitoring, and when gh-ost still wins.
Multi-source replication lets one replica fan in from many primaries with FOR CHANNEL syntax — but there is no conflict detection and no last-write-wins. Setup, per-channel monitoring, GTID bookkeeping, and when a pipeline beats fan-in.
The processlist fills with 'Waiting for table metadata lock' and the application stops, but the cause is a session doing nothing at all. A field guide to the MDL pileup, the kill-or-wait decision, and the guardrails that make it rare.
MySQL memory is not just the buffer pool. This guide maps global versus per-session allocations, shows how to interrogate performance_schema memory instrumentation, and walks through a real OOM-kill postmortem workflow.
Updating one key in an 18KB JSON document should not rewrite 18KB into the binlog. MySQL 8.0 can patch documents in place and log just the diff — when the change qualifies, and when it silently does not.
MySQL cannot index a JSON column directly, and the workarounds have sharp edges. Field notes on generated columns, multi-valued indexes, MEMBER OF pruning, and when to stop pretending and promote the field.
Dropping an index is instant; rebuilding it under incident pressure takes hours. Field notes on using MySQL 8.0 invisible indexes as a safety net, plus the audit workflow that finds safe candidates.
ALGORITHM=INSTANT is the best schema-change feature in MySQL 8.0, and the most misunderstood. These field notes cover what qualifies, the 64 row-version limit, and how to check before you ALTER.
Purge lag is usually a pinned read view, not weak purge threads. Here is how to tell the two failures apart, what innodb_purge_threads actually buys, and the alerts that matter.