TERM
Giao dịch ACID là một khái niệm quan trọng trong cơ sở dữ liệu, đảm bảo các thao tác trên dữ liệu được thực hiện một cách an toàn, nhất quán và đáng tin cậy. ACID là viết tắt của bốn thuộc tính: Atomicity (Tính nguyên tử), Consistency (Tính nhất quán), Isolation (Tính cô lập) và Durability (Tính bền vững)
Nhờ bốn thuộc tính này, các hệ quản trị cơ sở dữ liệu có thể đảm bảo tính toàn vẹn và độ tin cậy của dữ liệu, đặc biệt trong các ứng dụng quan trọng như ngân hàng, thương mại điện tử, quản lý tài chính.
| Tiêu chí | Quan hệ (SQL) | Phi quan hệ (NoSQL) |
| Cấu trúc dữ liệu | Cố định, chuẩn hóa, dạng bảng | Linh hoạt, không cần schema cố định |
| Mối quan hệ dữ liệu | Rõ ràng, hỗ trợ JOIN phức tạp | Hạn chế JOIN, tối ưu cho truy vấn nhanh |
| Mở rộng | Chủ yếu mở rộng dọc | Mở rộng ngang dễ dàng |
| Tính nhất quán | Cao (ACID) | Thường ưu tiên tính sẵn sàng, linh hoạt |
| Ứng dụng phù hợp | Hệ thống tài chính, ERP, CRM | Big data, real-time analytics, caching |
Hash join là một thuật toán dùng để thực hiện phép JOIN giữa hai bảng trong hệ quản trị cơ sở dữ liệu quan hệ, đặc biệt hiệu quả khi xử lý các bảng lớn và điều kiện join là so sánh bằng (equi-join).
Cách hoạt động của Hash Join gồm hai giai đoạn chính:
“id”: Record<contain_id>
Ưu điểm:
Nhược điểm:
Khi nào dùng hash join?
Ví dụ minh họa:
1SELECT p.id, p.title, pc.review
2FROM post p
3INNER JOIN post_comment pc ON pc.post_id = p.id;Cơ sở dữ liệu sẽ tạo hash table từ bảng nhỏ hơn (ví dụ bảng post), sau đó duyệt bảng còn lại để tìm các dòng khớp dựa trên giá trị hash.
Tóm lại, hash join là thuật toán join hiệu quả và phổ biến trong các hệ quản trị cơ sở dữ liệu hiện đại, đặc biệt phù hợp với các phép join lớn và điều kiện join là so sánh bằng.
Việc tối ưu hóa hiệu suất Database trở nên cực kỳ quan trọng để đảm bảo hệ thống vận hành tối ưu và sử dụng tài nguyên hiệu quả
Các best practice tối ưu hóa MySQL
EXPLAIN, EXPLAIN EXTENDED hoặc công cụ đồ họa như MySQL Workbench để xem execution plan.mysqlshow –status <dbname> để xem kích thước bảng, show index from <table_name> để kiểm tra index.Những thách thức thường gặp khi tối ưu hóa MySQL
Index có tác động trực tiếp đến việc truy vấn dữ liệu
Index (chỉ mục) là một cấu trúc dữ liệu trong cơ sở dữ liệu giúp cải thiện hiệu suất truy vấn. Một bảng có thể có một hoặc nhiều index liên kết với nó. Index được định nghĩa qua biểu thức trường (field expression), thường là tên một trường như emp_id. Ví dụ, index trên trường emp_id sẽ chứa danh sách đã sắp xếp các giá trị emp_id cùng với tham chiếu đến các dòng chứa giá trị đó.
Khi có index, driver cơ sở dữ liệu có thể tìm dòng dữ liệu nhanh hơn rất nhiều. Ví dụ, với truy vấn:
1WHERE EMP_id = 'E10001'Nếu không có index, server phải duyệt toàn bộ bảng để tìm dòng có EMP_id là 'E10001'. Nếu có index trên emp_id, server chỉ cần tra cứu index để tìm dòng phù hợp.
Bạn tạo index trên cột last_name:
1CREATE INDEX idx_lastname ON employees(last_name);Cấu trúc index sẽ như sau:
| last_name (Search Key) | Data Reference (Pointer) |
| Nguyen | Địa chỉ dòng 1, dòng 5, ... |
| Pham | Địa chỉ dòng 2 |
| Tran | Địa chỉ dòng 3, dòng 7, ... |
| ... | ... |
Khi bạn truy vấn:
1SELECT * FROM employees WHERE last_name = 'Nguyen';Cơ sở dữ liệu sẽ tra cứu index để nhanh chóng lấy ra tất cả các dòng có last_name = 'Nguyen' mà không cần quét toàn bộ bảng.
Ví dụ về tối ưu join với index
1SELECT * FROM dept, emp WHERE dept.dept_id = emp.dept_idNên có index trên trường emp.dept_id để tăng tốc join
Nếu join nhiều bảng
1SELECT * FROM dept, emp, addr WHERE dept.dept_id = emp.dept AND emp.loc = addr.locNên có index trên emp.dept và addr.loc.s
Bảng nhân viên
1CREATE TABLE employees (
2 employee_id INT PRIMARY KEY,
3 first_name VARCHAR(100),
4 last_name VARCHAR(100),
5 department_id INT
6);Case 1: Không có index trên cột last_name
1SELECT * FROM employees WHERE last_name = 'Nguyen';Nếu bạn chưa tạo index trên cột last_name, cơ sở dữ liệu sẽ phải quét toàn bộ bảng (full table scan) để tìm các dòng có last_name là 'Nguyen'. Điều này rất chậm nếu bảng lớn
Case 2: Tạo index trên cột last_name
1CREATE INDEX idx_lastname ON employees(last_name);Sau khi có index, khi chạy lại truy vấn
1SELECT * FROM employees WHERE last_name = 'Nguyen';Lúc này, cơ sở dữ liệu sẽ sử dụng index để tra cứu rất nhanh các dòng có last_name là 'Nguyen', thay vì phải duyệt toàn bộ bảng
SQL Transaction là một đơn vị logic bao gồm một hoặc nhiều thoa tác (như thêm, sửa, xóa dữ liệu) được thực hiện trên cơ sở dữ liệu.
Transaction đảm bảo rằng các thao tác này hoặc được thực hiện thành công toàn bộ, hoặc nếu có lỗi xảy ra thì tất cả sẽ bị hủy bỏ và dữ liệu được trả về trạng thái ban đầu trước khi transaction bắt đầu
Transaction phải tuân thủ 4 tính chất ACID
Một ví dụ điển hình là chuyển tiền giữa hai tài khoản ngân hàng: transaction sẽ gồm hai bước là trừ tiền ở tài khoản A và cộng tiền vào tài khoản B. Nếu chỉ một bước thành công còn bước kia thất bại, hệ thống sẽ rollback để đảm bảo không bị mất hoặc tạo ra tiền không hợp lệ
BEGIN TRANSACTION;COMMIT;ROLLBACK;Example
1BEGIN TRANSACTION;
2
3UPDATE Account SET Balance = Balance - 100 WHERE AccountID = 'A';
4UPDATE Account SET Balance = Balance + 100 WHERE AccountID = 'B';
5
6COMMIT;Nếu một trong hai lệnh UPDATE bị lỗi, bạn có thể dùng ROLLBACK để hoàn tác toàn bộ giao dịch
Trong hệ quản trị cơ sở dữ liệu (DBMS), ngoài các thuộc tính ACID (Atomicity, Consistency, Isolation, Durability), Isolation (tính cô lập) đóng vai trò quan trọng giúp đảm bảo tính nhất quán và toàn vẹn dữ liệu khi nhiều transaction (giao dịch) diễn ra đồng thời. Mức độ cô lập xác định mức độ mà một transaction phải được tách biệt khỏi các transaction khác, nhằm bảo vệ dữ liệu khỏi các hiện tượng không mong muốn
| Mức độ cô lập | Dirty Read | Non-repeatable Read | Phantom Read |
| Read Uncommitted | Có | Có | Có |
| Read Committed | Không | Có | Có |
| Repeatable Read | Không | Không | Có |
| Serializable | Không | Không | Không |
Ưu điểm:
Nhược điểm:
| Tên chuẩn hóa | Tên đầy đủ (Tiếng Anh) | Ý nghĩa chính |
| 1NF | First Normal Form | Mỗi cột chỉ chứa giá trị nguyên tử, không có nhóm lặp, mỗi bản ghi là duy nhất. |
| 2NF | Second Normal Form | Đạt 1NF và mọi thuộc tính không khóa phải phụ thuộc hoàn toàn vào khóa chính. |
| 3NF | Third Normal Form | Đạt 2NF và không có phụ thuộc bắc cầu giữa các thuộc tính không khóa. |
| BCNF | Boyce-Codd Normal Form | Mở rộng 3NF, mọi phụ thuộc hàm đều có vế trái là khóa ứng viên. |
| 4NF | Fourth Normal Form | Đạt BCNF và không có phụ thuộc đa trị không tầm thường. |
| 5NF | Fifth Normal Form | Đạt 4NF và không thể phân tách bảng thành các bảng nhỏ hơn mà không mất dữ liệu. |
| 6NF | Sixth Normal Form | Chia nhỏ bảng để loại bỏ mọi sự dư thừa phi thời gian (ít dùng thực tế). |
MongoDB là một cơ sở dữ liệu NoSQL dạng document, lưu trữ dữ liệu dưới dạng BSON/JSON, rất phổ biến trong các hệ thống web hiện đại nhờ khả năng mở rộng và linh hoạt cao.
Với vai trò frontend, em đánh giá cao MongoDB vì dữ liệu trả về dạng JSON rất thuận tiện cho việc render UI với React/NextJS, giảm thao tác chuyển đổi dữ liệu. Ngoài ra, khả năng mở rộng và hiệu năng của MongoDB giúp backend phục vụ dữ liệu cho các tính năng realtime như feed, comment, notification rất hiệu quả. Tuy nhiên, em cũng nhận thức được rằng nếu ứng dụng có nhiều nghiệp vụ liên quan đến dữ liệu quan hệ phức tạp hoặc cần đảm bảo tính nhất quán cao, thì nên cân nhắc kết hợp thêm SQL hoặc các giải pháp khác
.limit() để giới hạn số lượng bản ghi trả về, đặc biệt quan trọng với các tính năng như infinite scroll hoặc feed..explain() để kiểm tra execution plan, đảm bảo truy vấn sử dụng index hiệu quả, tránh full collection scan..skip() cho phân trang sâu, thay vào đó sử dụng phân trang dựa trên giá trị khóa như _id hoặc timestamp để tăng hiệu suất.Liên hệ thực tế với vai trò frontend
Với vai trò frontend, em đánh giá việc tối ưu hóa database MongoDB rất quan trọng vì nó ảnh hưởng trực tiếp đến tốc độ phản hồi API, từ đó quyết định trải nghiệm người dùng trên UI. Khi backend trả về dữ liệu nhanh, frontend có thể render mượt mà hơn, đặc biệt với các tính năng realtime như feed, comment, notification. Ngoài ra, dữ liệu trả về dạng JSON từ MongoDB cũng giúp frontend dễ dàng xử lý và tích hợp với các framework như React hoặc NextJS.
Nếu bạn có collection "users" với 1 triệu document, truy vấn sau sẽ gây ra full collection scan nếu không có index trên trường "address":
1db.users.find({ address: "Hanoi" })MongoDB sẽ phải duyệt qua toàn bộ 1 triệu document để tìm các document có address là "Hanoi”
NoSQL database mang lại nhiều lợi ích về khả năng mở rộng và linh hoạt, nhưng cũng có một số nhược điểm quan trọng
→ Vì vậy, các hệ thống noSQL thường được ưu tiên sử dụng cho những trường hợp cần khả năng mở rộng và linh hoạt cao, mặc dù SQL vẫn là lựa chọn mạnh mẽ khi cần đảm bảo tính nhất quán giao dịch