-
Encrypting MySQL Data at Rest
Encrypting MySQL data at rest with InnoDB tablespace encryption, and why it’s not a substitute for application-level encryption of sensitive fields.
-
Essential MySQL Command-Line Client Commands
Essential MySQL command-line client commands for quick diagnostics, including the underused \G vertical output format.
-
Partitioning Large MySQL Tables for Performance
Partitioning large MySQL tables by date range, and why it makes purging old time-series data dramatically faster.
-
Setting Up MySQL Replication for Redundancy
Setting up basic MySQL primary-replica replication for read scaling and redundancy, step by step.
-
MySQL Triggers Explained with Practical Examples
MySQL triggers explained with a price-audit and stock-validation example, and why to use them sparingly.
-
Designing a Simple E-Commerce Database Schema in MySQL
Designing a simple, correctly-normalized e-commerce database schema in MySQL, including the many-to-many order_items pattern.
-
phpMyAdmin vs the MySQL CLI: Pros and Cons of Each
phpMyAdmin vs the MySQL CLI: where each genuinely wins, and why an exposed phpMyAdmin install is a recurring security liability.
-
Foreign Keys and Referential Integrity in MySQL
Foreign keys and referential integrity in MySQL, and choosing the right ON DELETE behavior for each relationship.
-
Speeding Up Bulk Inserts in MySQL
Speeding up bulk inserts in MySQL with multi-row INSERT statements, LOAD DATA, and wrapping batches in a single transaction.
-
Keeping MySQL Credentials Out of Your Codebase
Keeping MySQL credentials out of your codebase with environment variables, and why a proper secrets manager beats a plain .env file at scale.
-
Managing MySQL User Permissions Securely
Managing MySQL user permissions with least-privilege access, and why scoping both grants and host wildcards matters.
-
MySQL vs PostgreSQL: Choosing the Right Database
MySQL vs PostgreSQL, evaluated honestly: where each one actually has an edge, without the tribal debate.
-
How MySQL Indexes Actually Speed Up Queries
How MySQL indexes actually speed up queries, with EXPLAIN examples, and why indexing every column is the wrong instinct.
-
Installing and Securing MySQL on Ubuntu Server
Installing and properly securing MySQL on Ubuntu Server, including the security wizard steps that are easy to skip.
-
MySQL Joins Explained: Inner, Left, Right, and Full Outer
MySQL join types explained with practical examples, including how to find orphaned rows and MySQL’s lack of FULL OUTER JOIN.
-
Managing MySQL Schema Changes with Migration Tools
Managing MySQL schema changes with versioned migration files instead of ad-hoc ALTER TABLE statements against production.
-
MySQL Basics: Writing Your First SELECT Statements
MySQL SELECT statement fundamentals: filtering, sorting, grouping, and the WHERE vs HAVING distinction.
-
Getting Started with MySQL Stored Procedures
Getting started with MySQL stored procedures through a real fund-transfer example, and the trade-offs of putting logic in the database.
-
Why Connection Pooling Matters for MySQL Performance
Why connection pooling matters for MySQL performance, and the difference between PHP’s persistent connections and real poolers like ProxySQL.
-
Choosing the Right MySQL Data Types for Your Columns
Choosing the right MySQL data types for your columns, and the common mistakes (money as FLOAT, dates as VARCHAR) that cause real bugs.
-
Migrating Legacy PHP Code from mysql_* to mysqli or PDO
Migrating legacy PHP code off the removed mysql_* functions to mysqli or PDO, with a direct before/after comparison.
-
Using MySQL’s JSON Column Type Effectively
Using MySQL’s native JSON column type effectively, including how to index into JSON paths with generated columns.
-
ORM vs Raw SQL: Trade-offs When Working with MySQL
ORM vs raw SQL trade-offs when working with MySQL, and why the right answer for most projects is both, used deliberately.
-
Common Table Expressions (CTEs) in MySQL 8
MySQL 8’s Common Table Expressions explained, including recursive CTEs for walking hierarchical data like org charts.
-
MariaDB vs MySQL: What Actually Differs
How MariaDB and MySQL diverged since MariaDB’s 2009 fork, and where they’re no longer safely interchangeable.
-
MySQL Character Sets: Why You Should Always Use utf8mb4
Why MySQL’s utf8 charset can’t store emoji, and why utf8mb4 should be the default for every new database.
-
Optimizing Slow MySQL Queries with EXPLAIN
Reading MySQL’s EXPLAIN output to diagnose slow queries: the red flags to look for and what they actually mean.
-
MySQL vs NoSQL: When a Relational Database Is Still the Right Choice
MySQL vs NoSQL evaluated honestly: when relational data modeling still wins, and where NoSQL genuinely solves a narrower problem better.
-
Backing Up and Restoring MySQL Databases with mysqldump
Backing up and restoring MySQL databases with mysqldump, and why –single-transaction is essential for live production backups.
-
The History of MySQL: From a Swedish Startup to Oracle
From a 1995 Swedish startup project to the backbone of the LAMP stack: the history of MySQL, Sun’s acquisition, and the MariaDB fork.
-
InnoDB vs MyISAM: Choosing a MySQL Storage Engine
Why InnoDB replaced MyISAM as MySQL’s default storage engine, and how to check and convert legacy tables.
-
MySQL Transactions and ACID Properties Explained
MySQL transactions and the ACID properties explained with a real money-transfer example, and why the storage engine matters.
-
Finding Slow Queries with the MySQL Slow Query Log
Finding slow MySQL queries with the slow query log, and analyzing results with mysqldumpslow and pt-query-digest.
-
Understanding MySQL Locking and Diagnosing Deadlocks
Understanding MySQL row locking and diagnosing deadlocks, plus the consistent-lock-ordering pattern that prevents most of them.
-
Setting Up MySQL InnoDB Cluster for High Availability
Setting up MySQL InnoDB Cluster for automated failover across multiple nodes using group replication.
-
Database Sharding Basics: When MySQL Needs to Scale Out
Database sharding basics: how horizontal partitioning across MySQL servers works, and why it should be a last resort, not a default.
-
MySQL Window Functions Explained with Examples
MySQL 8 window functions explained: ranking, running totals, and row comparisons without the old self-join workarounds.
-
Connecting to MySQL from PHP with PDO
Connecting to MySQL from PHP with PDO, and why prepared statements should be non-negotiable for any query touching user input.
-
Using MySQL Full-Text Search Instead of a Search Engine
Using MySQL’s built-in FULLTEXT search as a lighter alternative to Elasticsearch for small-to-medium datasets.
-
MySQL Views: What They Are and When to Use Them
MySQL views explained: hiding complex joins behind a simple name, and why views don’t cache results by default.
-
Using Generated Columns in MySQL
Using generated columns in MySQL to keep computed values automatically in sync, and the STORED vs VIRTUAL trade-off.