MySQL is an open‑source RDBMS built on the client / server model. Its core is the mysqld server process that manages:
InnoDB
storage engine.NDB
, MyRocks
).Latest versions · LTS branch 8.4 (8.4.4, Jan 21 2025) · Innovation branch 9.2 (9.2.0, Jan 21 2025)
# Debian/Ubuntu
$ sudo apt update
$ sudo apt install mysql-server
# RHEL/Rocky
$ sudo dnf install @mysql
$ brew install mysql
$ brew services start mysql
mysql_secure_installation
datadir
– data files location.innodb_buffer_pool_size
– cache for data + indexes.max_connections
– concurrency cap.log_error
, slow_query_log
.Common interfaces:
mysql
CLI · Batch: mysql < dump.sql
mysqlsh
) JSON/X API.libmysqlclient
(C), Connector/C++
, mysql-connector-python
, Node‑MySQL2
.// Node.js example
import mysql from 'mysql2/promise';
const db = await mysql.createConnection({
host: '127.0.0.1',
user: 'user',
password: 'secret',
database: 'shop'
});
const [rows] = await db.query('SELECT * FROM products;');
Type | Bytes | Range / Precision |
---|---|---|
TINYINT | 1 | ‑128 … 127 |
INT | 4 | ‑2 147 483 648 … |
DECIMAL(p,s) | var | Exact fixed‑point |
DATE
, DATETIME(6)
, TIMESTAMP
,
AUTO now().
VARCHAR(n)
, TEXT
, BLOB
.CHARSET
& COLLATE
for Unicode.JSON
– binary‑optimised since 5.7.CREATE DATABASE
app CHARACTER SET utf8mb4;CREATE TABLE
users( id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) UNIQUE, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE = InnoDB;
CREATE VIEW
active_users AS …
Generation with CREATE SEQUENCE
.
INSERT INTO
orders(user_id, total) VALUES (?,?);SELECT
name, SUM(total) AS spendFROM
ordersJOIN
users USING(id)WHERE
created > CURDATE() ‑ INTERVAL 30 DAYGROUP BY
user_idHAVING
spend > 1000ORDER BY
spend DESCLIMIT
10;
Tip – Use EXPLAIN ANALYZE
for runtime plans.
ALTER TABLE
postsADD FULLTEXT
(title, body),ADD SPATIAL
(location);
Left‑most prefix rule – index (A,B) can filter on A alone.
SELECT /*+ INDEX(t idx_date) */ … FROM t;
WITH RECURSIVE
nums AS(SELECT
1 AS nUNION ALL
SELECT
n+1 FROM nums WHERE n<10 )SELECT
* FROM nums;
SELECT user_id,
SUM(total) OVER(PARTITION BY user_id
ORDER BY created
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) AS running_total
FROM orders;
DELIMITER $$
CREATE PROCEDURE
add_user(IN email VARCHAR(255)) BEGIN INSERT INTO users(email) VALUES(email); END$$DELIMITER ;
Triggers · Event Scheduler for cron‑like tasks.
REPEATABLE READ
default (MVCC).SERIALIZABLE
for strict consistency.Note – XA 2‑PC for distributed transactions.
CREATE USER
'app'@'%' IDENTIFIED BY 'secret';GRANT SELECT,INSERT,UPDATE ON
shop.* TO 'app'@'%';ALTER USER
'app'@'%' REQUIRE SSL;
caching_sha2_password is default auth plugin since 8.0.
# Dump
mysqldump -u root -p --single-transaction shop > shop.sql
# Restore
mysql < shop.sql
Use mysqlbackup (Enterprise) or Percona XtraBackup for open‑source.
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='primary', SOURCE_PORT=3306,
SOURCE_USER='rep', SOURCE_PASSWORD='***',
SOURCE_AUTO_POSITION=1;
performance_schema
, sys
schema views.SHOW STATUS
, INFORMATION_SCHEMA
.SELECT ROUND((innodb_buffer_pool_bytes_data/
innodb_buffer_pool_bytes_total)*100,2) AS pct_used
FROM performance_schema.global_status
WHERE VARIABLE_NAME LIKE 'Innodb_buffer_pool%';
SELECT
JSON_EXTRACT(doc, '$.price') AS price
FROM products WHERE JSON_CONTAINS(tags, '"sale"');
Spatial reference privileges added 9.2.0 .
ALTER TABLE … ADD COLUMN total DECIMAL(10,2) AS (qty*price) STORED;
Use RANGE
, HASH
, or
KEY
partitions; or orchestrate sharding with
Vitess / ProxySQL.
mysqlsh upgrade checker
.LTS → LTS (8.0 → 8.4) recommended; innovation lines jump annually.
CREATE_SPATIAL_REFERENCE_SYSTEM
(9.2). ADD COLUMN
for many DDL cases (8.3).EXPLAIN ANALYZE
JSON output.innodb_file_per_table=ON
.utf8mb4
over legacy utf8
.SHOW REPLICA STATUS\G
.