-
Giới thiệu và khởi tạo môi trường MySQL
- Hướng dẫn cài đặt và cấu hình MySQL Server trên Windows cho kết nối từ xa
- Vận dụng tư duy phân tích dữ liệu với Mysql từ cơ bản đến nâng cao
- Vận dụng tư duy phân tích quản trị dữ liệu với MySQL
- Tối ưu hoá công việc quản trị với view và bảng tạm
- Tôi ưu hoá với thủ tục – procedure trong mysql
- Nhóm hàm windown
- Con trỏ và phân vùng trong mysql
- Làm việc với hàm tự tạo trong Mysql
- Làm việc với trigger trong Mysql
- Làm việc với giao dịch
- Tìm hiểu về truy vấn động
- Even – Sự kiện định kỳ trong Mysql
-
Quản trị dữ liệu trong doanh nghiệp
- Tổng quan về trục quản trị dữ liệu
- Quản trị & Giám sát hệ thống với cơ sở dữ liệu ảo information_schema
- Cấu hình và lưu trữ
- Cấu hình file my.ini
- An toàn và toàn vẹn dữ liệu – Bảo mật – Backup
- Hiệu năng và tối ưu hoá
- Đồng bộ và phục hồi
- Phân tích tối ưu hoá hiệu năng với dữ liệu bảng performance_schema
-
Chiến lược quản trị dữ liệu
Nhóm hàm windown
Hàm LAG, LEAD, RANK, DENSE_RANK, ROW_NUMBER là window functions (hàm cửa sổ) được MySQL hỗ trợ từ phiên bản 8.0 trở lên, giúp quan sát dữ liệu theo thứ tự mà không cần tự join chính nó.
🎯 1️⃣. Mục đích trong quản trị hệ thống CSDL
Các hàm này cho phép DBA hoặc Data Engineer:
- So sánh giá trị giữa các bản ghi liền kề (LAG, LEAD) để phát hiện thay đổi, bất thường.
- Tạo thứ hạng, xếp loại (RANK, DENSE_RANK) khi giám sát hiệu năng, tần suất truy vấn.
- Tạo số thứ tự (ROW_NUMBER) khi cần gán ID tạm hoặc kiểm tra bản ghi trùng lặp.
- Phân tích xu hướng, lịch sử thay đổi dữ liệu, hoặc biến động giao dịch hệ thống.
🧠 2️⃣. Tổng quan các hàm
| Hàm | Mục đích | Cú pháp cơ bản |
|---|---|---|
LAG() |
Lấy giá trị của bản ghi trước đó trong cùng nhóm | LAG(column, offset, default) OVER (PARTITION BY ... ORDER BY ...) |
LEAD() |
Lấy giá trị của bản ghi sau đó | LEAD(column, offset, default) OVER (...) |
ROW_NUMBER() |
Đánh số thứ tự duy nhất trong mỗi nhóm | ROW_NUMBER() OVER (...) |
RANK() |
Xếp hạng, nhưng có thể nhảy số khi trùng hạng | RANK() OVER (...) |
DENSE_RANK() |
Xếp hạng liền kề, không nhảy số | DENSE_RANK() OVER (...) |
🧩 3️⃣. Ứng dụng thực tế trong nghiệp vụ quản trị dữ liệu Kho bạc
🧾 Ví dụ 1 — Theo dõi biến động số dư hàng ngày
Giả sử bảng giao_dich_tien_gui lưu:
| ngay_gd | ma_tk | so_du |
|---|---|---|
| 2025-01-01 | TK001 | 1,000,000 |
| 2025-01-02 | TK001 | 1,050,000 |
| 2025-01-03 | TK001 | 950,000 |
Mục tiêu: Tính chênh lệch so với ngày trước → phát hiện bất thường.
SELECT
ma_tk,
ngay_gd,
so_du,
LAG(so_du, 1, 0) OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS so_du_truoc,
so_du - LAG(so_du, 1, 0) OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS chenhlech
FROM giao_dich_tien_gui;
📊 Kết quả:
| ma_tk | ngay_gd | so_du | so_du_truoc | chenhlech |
|---|---|---|---|---|
| TK001 | 2025-01-01 | 1,000,000 | 0 | +1,000,000 |
| TK001 | 2025-01-02 | 1,050,000 | 1,000,000 | +50,000 |
| TK001 | 2025-01-03 | 950,000 | 1,050,000 | -100,000 |
👉 Dễ dàng phát hiện biến động bất thường (-100,000).
⚙️ Ví dụ 2 — Giám sát hiệu năng truy vấn
Giả sử bảng log_truyvan có:
| user | thoi_gian | so_lan_truyvan |
Mục tiêu: So sánh số lần truy vấn hiện tại và trước đó.
SELECT
user,
thoi_gian,
so_lan_truyvan,
LAG(so_lan_truyvan) OVER (PARTITION BY user ORDER BY thoi_gian) AS lan_truoc,
so_lan_truyvan - LAG(so_lan_truyvan) OVER (PARTITION BY user ORDER BY thoi_gian) AS tang_giam
FROM log_truyvan;
📌 Ứng dụng:
- Theo dõi user đột ngột tăng tần suất truy vấn.
- Cảnh báo truy cập bất thường hoặc tấn công từ nội bộ.
📊 Ví dụ 3 — Phân loại mức độ tải của máy chủ (RANK)
Bảng hieu_nang_server:
| may_chu | ngay | so_truyvan |
SELECT
ngay,
may_chu,
so_truyvan,
RANK() OVER (PARTITION BY ngay ORDER BY so_truyvan DESC) AS thu_hang
FROM hieu_nang_server;
→ Cho biết máy chủ nào đang tải cao nhất mỗi ngày.
🧾 Ví dụ 4 — Gán mã duy nhất cho bản ghi trùng (ROW_NUMBER)
SELECT
ROW_NUMBER() OVER (PARTITION BY ma_tk ORDER BY ngay_gd) AS stt,
*
FROM giao_dich_tien_gui;
→ Phát hiện bản ghi trùng lặp hoặc sai thứ tự thời gian.
🔍 4️⃣. Mở rộng trong giao dịch và quản trị hệ thống
| Mục tiêu quản trị | Hàm hỗ trợ | Ứng dụng |
|---|---|---|
| Phát hiện sai lệch số dư hoặc dữ liệu bị rollback | LAG, LEAD |
So sánh dữ liệu giữa 2 snapshot |
| Theo dõi tăng trưởng hoặc suy giảm hiệu năng | LAG, LEAD, RANK |
Theo dõi log performance |
| Kiểm tra bản ghi trùng | ROW_NUMBER() |
Xác định và dọn dữ liệu trùng |
| Xếp loại truy vấn chậm | RANK() |
Ưu tiên tối ưu nhóm 1 |
| Xếp hạng chi nhánh có khối lượng giao dịch cao | DENSE_RANK() |
Thống kê theo ngày/tháng |
🧮 5️⃣. Kỹ năng thực hành gợi ý (trong lab)
| Bài tập | Mục tiêu | Hàm trọng tâm |
|---|---|---|
| So sánh doanh thu kỳ trước và kỳ này | Biến động dữ liệu | LAG, LEAD |
| Xếp hạng chi nhánh theo tổng tiền gửi | Thống kê | RANK, DENSE_RANK |
| Tìm dữ liệu trùng hoặc bản ghi sai lệch | Làm sạch dữ liệu | ROW_NUMBER() |
| Theo dõi sự thay đổi giá trị giữa hai trạng thái | Giám sát | LAG, LEAD |
⚙️ 6️⃣. Cấu trúc kỹ thuật trong MySQL Workbench
Trong Workbench:
- Vào SQL Editor → Query Tab → Run Script để thực hành các ví dụ trên.
- Dùng Visual Explain để xem kế hoạch thực thi (execution plan) và hiệu năng hàm cửa sổ.
- Dùng Performance Schema hoặc Sys Schema để so sánh kết quả thực tế giữa các truy vấn có/không dùng hàm window.
📘 7️⃣. Kết luận
| Điểm khác biệt | MySQL 8.0 trở lên | Oracle / SQL Server |
|---|---|---|
| Hỗ trợ đầy đủ window functions | ✅ Có (từ 8.0) | ✅ Có từ lâu |
| Cú pháp tương tự | OVER (PARTITION BY ... ORDER BY ...) |
Gần như tương đồng |
| Tối ưu hiệu năng | Nên có index phù hợp | Giống nguyên tắc Oracle |
| Ứng dụng | Báo cáo, kiểm soát, giám sát dữ liệu | Tương tự Oracle / SQL Server |