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.


1. Window Functions (SQL mạnh hơn rất nhiều)

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:

  • subquery
  • self join
  • biến session

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.


2. CTE (Common Table Expression)

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

  • query dễ đọc hơn
  • tái sử dụng logic
  • hỗ trợ recursive query

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.


3. Index mạnh hơn (Functional Index)

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:

  • index không dùng được
  • phải tạo thêm column phụ

4. JSON mạnh hơn nhiều

MySQL 5.7 chỉ hỗ trợ JSON cơ bản.

MySQL 8 bổ sung:

  • JSON_TABLE()
  • JSON_OVERLAPS()
  • JSON_SCHEMA_VALID()
  • ->> operator
  • index JSON tốt hơn

Ví 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.


5. Optimizer thông minh hơn

Optimizer của MySQL 8 cải tiến rất mạnh.

Ví dụ

  • hash join
  • derived table optimization
  • subquery optimization
  • index skip scan

Ví dụ trước đây

SELECT *
FROM orders
WHERE YEAR(created_at) = 2024;

MySQL 5:

  • không dùng index

MySQL 8:

  • optimizer có thể rewrite query để dùng index.

6. Invisible Index (test index an toàn)

MySQL 8 có thể tắt index mà không xóa.

ALTER TABLE users
ALTER INDEX idx_email INVISIBLE;

Database:

  • vẫn giữ index
  • optimizer không dùng index đó

Dùng để:

  • test performance
  • kiểm tra index có cần không

MySQL 5 không có.


7. Role Based Access Control

MySQL 8 có role giống PostgreSQL.

CREATE ROLE developer;
GRANT SELECT, INSERT ON db.* TO developer;
GRANT developer TO 'user1'@'%';

MySQL 5:

  • phải grant từng user.

8. Default charset tốt hơn

MySQL 5 mặc định

latin1

MySQL 8 mặc định

utf8mb4

Hỗ trợ:

  • emoji
  • unicode đầy đủ

9. Descending index

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:

  • chỉ có ASC index

Tổng kết

MySQL 8 mạnh hơn MySQL 5 ở 4 hướng lớn

1 SQL language mạnh hơn

  • Window Function
  • CTE
  • Recursive query

2 Index tốt hơn

  • Functional index
  • Desc index
  • Invisible index

3 JSON mạnh hơn

  • JSON_TABLE
  • JSON query

4 Optimizer thông minh hơn

  • Hash join
  • Subquery optimization

💡 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