MySQL

Giới thiệu và Cài đặt MySQL 8.4 LTS / 9.7 LTS

MySQL — RDBMS open-source phổ biến nhất. Bản 9.7 LTS mới (04/2026, đến ~2034) với Hypergraph Optimizer vào Community, PBKDF2+SHA512, JavaScript in-database.

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ảnReleaseEOL
MySQL 9.7 LTS21/04/2026~2034
MySQL 8.4 LTS04/202404/2032
MySQL 8.0 (cuối cùng support)201804/2026 (đã EOL)
Khuyến nghị 2026:
  • 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!)

Query planner mới dùng DPhyp algorithm — JOIN-heavy analytics nhanh 2–5x so với optimizer cũ. Từ 9.7, vào luôn Community Edition (trước đây chỉ có Enterprise). Bật bằng SET optimizer_switch="hypergraph=on".

PBKDF2 + SHA512

Hashing password nâng cao với 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

Viết stored procedure / function bằng JavaScript chạy trực tiếp trong MySQL nhờ GraalVM engine. Không cần compile, linh hoạt hơn SQL thuần.

OpenID Authentication

Login bằng IdP OIDC (Okta, Azure AD, Google...) — không cần password lưu trong DB. Native support từ 9.7.

Telemetry Component (Community)

Công cụ monitoring & diagnostics từng chỉ có Enterprise — giờ vào Community. Thu thập metrics, slow query insight mà không cần tool ngoài.

DML on JSON Duality Views

INSERT/UPDATE/DELETE trực tiếp trên JSON Duality View — kết hợp sức mạnh relational + document trong cùng 1 câu lệnh. Community Edition.
Câu PV:"Hypergraph Optimizer là gì? Khi nào nên bật?"

"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

Các cải tiến đáng chú ý trong MySQL 9.7 LTS:
  • 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ặc mysql-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

MySQL có nhiều storage engine. Default & 99% case dùng:
  • 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;
Câu PV cốt lõi:"InnoDB vs MyISAM khác gì?"
InnoDBMyISAM
Transaction✅ ACID
Foreign key
Row-level lock❌ (table lock)
Crash recovery⚠️ Yếu
Full-text✅ (5.6+)✅ (legacy)
Default
Luôn dùng InnoDB. MyISAM chỉ còn cho legacy schema.

4. Tool quản lý

ToolGhi chú
MySQL WorkbenchChính chủ Oracle, free, all-platform.
DBeaverFree, đa DB.
TablePlusUI đẹp, free version giới hạn.
phpMyAdminWeb-based, classic LAMP stack.
DataGripJetBrains, trả phí.
mysql CLIBuilt-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ệnhTá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
\qQuit
\!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;
MySQL conventions:
  • Default utf8mb4 (full Unicode bao gồm emoji). Tránh utf8 cũ (3 byte, không emoji).
  • Identifier với backtick `Name`.
  • AUTO_INCREMENT (1 từ, không space) cho auto-id.
  • DATETIME vs TIMESTAMP: 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ả.
Câu PV:"utf8 và utf8mb4 khác gì?"

"utf8 của MySQL chỉ là 3-byte UTF-8 (không bao emoji, không bao 1 số ký tự Asian). utf8mb4 là 4-byte UTF-8 đầy đủ chuẩn. Luôn dùng utf8mb4 cho 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 8.4+ bẫy: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
Câu PV:"caching_sha2_password ở 8.4 và 9.7 khác gì?"

"Từ 8.4, caching_sha2_password là 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 m hoặc LIMIT 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.

© 2026 .NET Fresher Guide. All rights reserved.

Về Trang Web

Hướng dẫn toàn diện để chuẩn bị phỏng vấn vị trí .NET Fresher với nội dung từ lý thuyết đến thực hành.