MySQL version 8 cải tiến khá nhiều so với version 5.7 (thường gọi tắt là MySQL 5). Nếu nhìn từ góc độ developer backend và database performance, thì MySQL 8 hơn ở 5 nhóm lớn sau.
Trong MySQL 5.7 không có window function, nên các bài toán phân tích dữ liệu phải dùng:
MySQL 8 hỗ trợ trực tiếp các hàm như:
ROW_NUMBER()RANK()DENSE_RANK()LAG()LEAD()SUM() OVER()Ví dụ lấy 3 bài viết mới nhất mỗi category
SELECT *
FROM (
SELECT
id,
category_id,
created_at,
ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY created_at DESC) AS rn
FROM posts
) t
WHERE rn <= 3;
Ở MySQL 5.7 bài toán này phải self join rất nặng.
👉 Đây là thay đổi rất lớn cho data analytics.
MySQL 8 hỗ trợ WITH query.
WITH top_posts AS (
SELECT *
FROM posts
ORDER BY views DESC
LIMIT 10
)
SELECT *
FROM top_posts
WHERE views > 1000;
Ưu điểm
Ví dụ cây category
WITH RECURSIVE category_tree AS (
SELECT id, parent_id, name
FROM categories
WHERE parent_id IS NULL UNION ALL SELECT c.id, c.parent_id, c.name
FROM categories c
JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT * FROM category_tree;
Trong MySQL 5 gần như không làm được recursive query.
MySQL 8 hỗ trợ index trên expression.
Ví dụ
CREATE INDEX idx_lower_email ON users ((LOWER(email)));
Query
SELECT * FROM users WHERE LOWER(email) = '[email protected]';
Ở MySQL 5:
MySQL 5.7 chỉ hỗ trợ JSON cơ bản.
MySQL 8 bổ sung:
JSON_TABLE()JSON_OVERLAPS()JSON_SCHEMA_VALID()->> operatorVí dụ convert JSON thành table
SELECT *
FROM JSON_TABLE(
'[{"name":"A"},{"name":"B"}]',
'$[*]' COLUMNS (
name VARCHAR(50) PATH '$.name'
)
) AS jt;
MySQL 5 không có JSON_TABLE.
Optimizer của MySQL 8 cải tiến rất mạnh.
Ví dụ
Ví dụ trước đây
SELECT * FROM orders WHERE YEAR(created_at) = 2024;
MySQL 5:
MySQL 8:
MySQL 8 có thể tắt index mà không xóa.
ALTER TABLE users ALTER INDEX idx_email INVISIBLE;
Database:
Dùng để:
MySQL 5 không có.
MySQL 8 có role giống PostgreSQL.
CREATE ROLE developer; GRANT SELECT, INSERT ON db.* TO developer; GRANT developer TO 'user1'@'%';
MySQL 5:
MySQL 5 mặc định
latin1
MySQL 8 mặc định
utf8mb4
Hỗ trợ:
MySQL 8 hỗ trợ index giảm dần
CREATE INDEX idx_date_desc ON posts(created_at DESC);
Rất tốt cho query
ORDER BY created_at DESC LIMIT 10
MySQL 5:
MySQL 8 mạnh hơn MySQL 5 ở 4 hướng lớn
1 SQL language mạnh hơn
2 Index tốt hơn
3 JSON mạnh hơn
4 Optimizer thông minh hơn
💡 Nếu nói ngắn gọn theo góc nhìn backend engineer:
MySQL 5 là OLTP database truyền thống
MySQL 8 bắt đầu tiến tới OLTP + analytics hybrid