Giới thiệu và Cài đặt MySQL 8.4 LTS / 9.7 LTS
1. Chọn bản MySQL nào?
MySQL có 2 nhánh release song song:
- LTS (Long Term Support): ổn định, fix bug & security ~8 năm.
- Innovation: cập nhật feature mới mỗi quý, support ngắn.
Các bản LTS hiện hành
| Bản | Release | EOL |
|---|---|---|
| MySQL 9.7 LTS | 21/04/2026 | ~2034 |
| MySQL 8.4 LTS | 04/2024 | 04/2032 |
| MySQL 8.0 (cuối cùng support) | 2018 | 04/2026 (đã EOL) |
- Project mới: MySQL 9.7 LTS (mới nhất, Hypergraph optimizer vào Community Edition, JS in-database, PBKDF2+SHA512).
- Project cũ đang chạy: MySQL 8.4 LTS vẫn OK (support đến 2032). Nếu đang dùng 8.0 — migrate ngay vì đã EOL 04/2026.
Highlight MySQL 9.7 LTS
Hypergraph Optimizer (🔥 Community!)
SET optimizer_switch="hypergraph=on".PBKDF2 + SHA512
caching_sha2_password + PBKDF2 — chống brute-force tốt hơn SHA256. Khuyến nghị cho mọi user mới.JavaScript In-Database
OpenID Authentication
Telemetry Component (Community)
DML on JSON Duality Views
"Hypergraph Optimizer là query planner mới của MySQL dùng thuật toán DPhyp thay vì greedy search của optimizer cũ. Mạnh nhất với query JOIN 3+ bảng (subquery, derived table), nhanh 2-5x. Từ MySQL 9.7 có sẵn trong Community Edition. Bật linh hoạt ở 4 cấp: session (
SET SESSION optimizer_switch="hypergraph=on"), global, persisted (my.cnf), hoặc per-statement (SELECT /*+ SET_VAR(optimizer_switch='hypergraph=on') */ ...). Nên test kỹ trước khi bật global vì không phải query nào cũng được lợi."
Một số tính năng khác của 9.7
- cpuset cgroup support — Phát hiện chính xác số CPU trong container (Docker/K8s), tránh over-subscribe thread pool.
- FTS index memory optimization — Giảm memory khi build full-text search index.
- Parallel reader fixes — Ổn định hơn cho parallel query execution.
- Downward replication — Cho phép replicate từ source bản cao hơn xuống replica bản thấp hơn (
replica_allow_higher_version_source). Hữu ích khi upgrade dần. - Clone plugin hỗ trợ cloning giữa các bản LTS liên tiếp (8.4 → 9.7).
- PGO (Profile Guided Optimization) cho RPM builds — hiệu suất runtime tốt hơn.
- Dynamic Data Masking (Enterprise only) — Che dữ liệu nhạy cảm (PII) ở cấp cột bằng masking policy.
2. Cài đặt — 3 cách
Cách 1 (khuyên dùng) — Docker
# MySQL 9.7 LTS (khuyên dùng cho project mới)
docker run --name mysql97 \
-e MYSQL_ROOT_PASSWORD=mysecretpw \
-e MYSQL_DATABASE=learnmysql \
-p 3306:3306 \
-v mysqldata:/var/lib/mysql \
-d mysql:9.7
# MySQL 8.4 LTS (cho project đang chạy 8.x)
docker run --name mysql84 \
-e MYSQL_ROOT_PASSWORD=mysecretpw \
-p 3307:3306 \
-d mysql:8.4
Cách 2 — Native install
- Windows: tải MySQL Installer từ dev.mysql.com.
- macOS:
brew install mysql. - Ubuntu:
sudo apt install mysql-server-9.7(hoặcmysql-server-8.4).
Sau install:
sudo mysql_secure_installation # set password, disable remote root
sudo systemctl start mysql
Cách 3 — Managed cloud
- PlanetScale (Vitess-based, MySQL-compatible, free tier).
- AWS RDS / Aurora MySQL.
- MySQL HeatWave (Oracle).
- Google Cloud SQL for MySQL.
3. Storage engine
- InnoDB — transactional, ACID, FK, row-locking, MVCC. Mặc định nên dùng.
- MyISAM — non-transactional, full-text search cũ. Legacy, tránh.
- Memory — in-RAM, cho cache.
- CSV, Archive, Federated — niche.
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(150) NOT NULL UNIQUE
) ENGINE = InnoDB;
| InnoDB | MyISAM | |
|---|---|---|
| Transaction | ✅ ACID | ❌ |
| Foreign key | ✅ | ❌ |
| Row-level lock | ✅ | ❌ (table lock) |
| Crash recovery | ✅ | ⚠️ Yếu |
| Full-text | ✅ (5.6+) | ✅ (legacy) |
| Default | ✅ | ❌ |
4. Tool quản lý
| Tool | Ghi chú |
|---|---|
| MySQL Workbench | Chính chủ Oracle, free, all-platform. |
| DBeaver | Free, đa DB. |
| TablePlus | UI đẹp, free version giới hạn. |
| phpMyAdmin | Web-based, classic LAMP stack. |
| DataGrip | JetBrains, trả phí. |
| mysql CLI | Built-in. |
5. CLI cơ bản
# Kết nối
mysql -h localhost -P 3306 -u root -p
# In một câu lệnh
mysql -u root -p -e "SHOW DATABASES;"
# Import file
mysql -u root -p learnmysql < schema.sql
# Export
mysqldump -u root -p learnmysql > backup.sql
Lệnh trong mysql CLI
| Lệnh | Tác dụng |
|---|---|
SHOW DATABASES; | List DB |
USE dbname; | Chọn DB |
SHOW TABLES; | List table trong DB hiện tại |
DESCRIBE tbl; / DESC tbl; | Xem schema bảng |
SHOW CREATE TABLE tbl; | Xem CREATE statement |
SHOW INDEX FROM tbl; | List index |
\q | Quit |
\! | Run shell command |
STATUS; | Connection info |
6. Tạo database đầu tiên
CREATE DATABASE learnmysql
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
USE learnmysql;
CREATE TABLE greetings (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
text VARCHAR(200) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE = InnoDB;
INSERT INTO greetings (text) VALUES ('Xin chào MySQL 9.7!');
SELECT * FROM greetings;
- Default
utf8mb4(full Unicode bao gồm emoji). Tránhutf8cũ (3 byte, không emoji). - Identifier với backtick
`Name`. AUTO_INCREMENT(1 từ, không space) cho auto-id.DATETIMEvsTIMESTAMP: TIMESTAMP convert UTC, DATETIME lưu nguyên giá trị.LIMIT N OFFSET M, không có TOP.- Lệnh kết thúc
;. - Không có
GO.
7. Character set & collation
⭐ Cực kỳ quan trọng — sai charset là gốc lỗi tiếng Việt:
-- Xem charset hiện tại
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
-- Cấp database
ALTER DATABASE learnmysql
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
-- Cấp bảng
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Suffix collation:
_ai_ci: accent-insensitive, case-insensitive ("a" = "A" = "á")._as_cs: accent-sensitive, case-sensitive._bin: binary, sensitive tất cả.
"
utf8của MySQL chỉ là 3-byte UTF-8 (không bao emoji, không bao 1 số ký tự Asian).utf8mb4là 4-byte UTF-8 đầy đủ chuẩn. Luôn dùngutf8mb4cho mọi project mới. Default từ MySQL 8.0."
8. Cấu hình user & quyền
-- Tạo user (9.7: mặc định PBKDF2+SHA512 qua caching_sha2_password)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'apppwd';
-- Grant quyền
GRANT SELECT, INSERT, UPDATE, DELETE ON learnmysql.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
-- Đổi password
ALTER USER 'appuser'@'%' IDENTIFIED BY 'newpwd';
-- Tạo user với plugin auth cũ (chỉ khi cần legacy app)
CREATE USER 'olduser'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
-- ⚠️ 8.4+ phải bật mysql_native_password explicit trong my.cnf
mysql_native_passworddisabled mặc định. Nếu app cũ dùng plugin này → connection lỗi. Bật lại:# /etc/mysql/my.cnf
[mysqld]
mysql_native_password = ON
"Từ 8.4,
caching_sha2_passwordlà auth plugin mặc định dùng SHA256. Từ MySQL 9.7, nâng cấp lên PBKDF2+SHA512 — thêm salt rounds và key stretching, chống brute-force mạnh hơn đáng kể. Khi tạo user mới trên 9.7, password tự động được hash bằng PBKDF2. User migrate từ 8.4 lên 9.7 vẫn dùng SHA256 cũ cho đến khi đổi password."
9. Đặc thù MySQL cần biết ngay
- Identifier: backtick
`Name`(vs[]SQL Server,""Postgres). - String:
'text'UTF-8 (utf8mb4). - Concat:
CONCAT(a, b, c)—+là cộng số, không nối chuỗi! - Boolean:
TINYINT(1)(0/1) — không có BOOLEAN thật. - Now:
NOW(),CURRENT_TIMESTAMP,UTC_TIMESTAMP(). - Auto-increment:
AUTO_INCREMENT(1 từ). - Limit:
LIMIT n OFFSET mhoặcLIMIT m, n. - UPSERT:
INSERT ... ON DUPLICATE KEY UPDATE .... - Schema = Database — không tách như Postgres/SQL Server.
- Case sensitivity: Linux phân biệt hoa thường (case-sensitive identifier), Windows không.