MySQL là gì?

Trả lời nhanh: MySQL là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) mã nguồn mở, lưu dữ liệu thành bảng và truy vấn bằng SQL. Nó chạy theo mô hình máy khách – máy chủ, thường dùng cho website và ứng dụng giao dịch. Khi truy vấn chậm, bạn tìm nó bằng slow query log rồi sửa bằng index và EXPLAIN.

Điểm chính

  • MySQL là phần mềm máy chủ quản lý dữ liệu. SQL chỉ là ngôn ngữ để nói chuyện với nó.
  • Công cụ lưu trữ mặc định InnoDB lo giao dịch (ACID), khoá dòng và khôi phục sau sự cố.
  • Hiện bản được hỗ trợ là 8.4 LTS và 9.7 LTS. MySQL 5.7 và 8.0 đã hết vòng đời.
  • Phần lớn truy vấn chậm đến từ thiếu index, index sai thứ tự cột hoặc viết điều kiện làm index vô dụng.
  • Quy trình sửa: bật slow query log, chọn truy vấn tốn nhất, chạy EXPLAIN, sửa index, đo lại.
Mục lục
  1. MySQL là gì và nó khác SQL ở đâu?
  2. Lịch sử và vòng đời phiên bản: bạn nên dùng bản nào?
  3. MySQL hoạt động thế nào bên trong?
  4. Dữ liệu trong MySQL được tổ chức ra sao?
  5. MySQL dùng cho việc gì trong doanh nghiệp Việt Nam?
  6. Cách tối ưu truy vấn chậm trong MySQL
  7. Ưu điểm và hạn chế của MySQL
  8. MySQL so với các lựa chọn gần
  9. Khi nào nên và không nên chọn MySQL?
  10. Câu hỏi thường gặp

MySQL là gì và nó khác SQL ở đâu?

MySQL là hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở, dùng ngôn ngữ truy vấn có cấu trúc (SQL) để quản lý và thao tác dữ liệu. Nói cách khác, MySQL là một chương trình chạy liên tục trên máy chủ (tiến trình mysqld, cổng mặc định 3306). Nó nhận câu lệnh, kiểm tra quyền, tìm dữ liệu và trả kết quả.

Nhiều người nhầm MySQL với SQL. SQL là ngôn ngữ chuẩn, bạn có thể đọc thêm trong bài câu lệnh SQL cơ bản. MySQL là một trong nhiều phần mềm hiểu SQL, cùng nhóm với PostgreSQL, SQL Server hay Oracle Database. Cùng một câu SELECT có thể chạy ở nhiều hệ, nhưng kiểu dữ liệu, hàm ngày giờ, cách phân trang và công cụ phân tích truy vấn mỗi hệ một khác.

Nếu bạn chưa rõ cơ sở dữ liệu nói chung là gì, hãy xem trước bài cơ sở dữ liệu và DBMS. Bài này đi thẳng vào riêng MySQL.

Lịch sử và vòng đời phiên bản: bạn nên dùng bản nào?

MySQL ra đời năm 1995 do công ty Thụy Điển MySQL AB phát triển. Ba người tạo ra nó là Michael Widenius, David Axmark và Allan Larsson. Sau đó Sun Microsystems mua MySQL AB, rồi Oracle mua Sun, nên hiện nay Oracle phát triển và phân phối MySQL. Widenius sau này tách ra MariaDB, một nhánh phát triển độc lập từ mã MySQL. Hai hệ vẫn giống nhau ở bề mặt nhưng đã khác nhau dần ở tính năng và hành vi.

Điểm quan trọng với doanh nghiệp là vòng đời. Từ bản 8.4, MySQL có hai nhánh. Bản LTS ra khoảng hai năm một lần (8.4 vào tháng 4/2024, 9.7 vào tháng 4/2026), mỗi bản có năm năm hỗ trợ chính và ba năm hỗ trợ mở rộng. Các bản Innovation (loạt 9.0–9.6) chỉ được hỗ trợ đến khi bản quý kế tiếp phát hành. Vì vậy một bản “mới hơn” không có nghĩa là được hỗ trợ lâu hơn.

Dòng thời gian MySQL: 10/2015 ra mắt 5.7; 10/2023 5.7 hết hỗ trợ; 04/2024 ra mắt 8.4 LTS; 04/2026 8.0 hết vòng đời; 04/2026 ra mắt 9.7 LTS
Mốc vòng đời MySQL theo lịch hỗ trợ của Oracle, tổng hợp từ các trang theo dõi vòng đời phần mềm, 2026.

Các mốc cụ thể: MySQL 5.7 kết thúc vòng đời ngày 31/10/2023. MySQL 8.0 hết hỗ trợ chính ngày 30/4/2025 và hết vòng đời ngày 30/4/2026. MySQL 8.4 LTS hết hỗ trợ chính ngày 30/4/2029 và hết vòng đời ngày 30/4/2032. Với hệ thống mới, bạn nên chọn 8.4 LTS hoặc 9.7 LTS. Nếu đang chạy 5.7 hoặc 8.0 trên máy chủ tự quản, đó là việc cần lập kế hoạch nâng cấp, vì khi hết hạn hỗ trợ, Oracle ngừng phát hành bản vá bảo mật cho phiên bản đó. Dịch vụ cloud có thể có lịch hỗ trợ kéo dài riêng, bạn cần đọc điều khoản của nhà cung cấp.

Bài này dựa trên lịch hỗ trợ công bố đến tháng 10/2026. Trước khi nâng cấp, hãy đối chiếu lại với trang chính thức của Oracle, vì các mốc phụ thuộc chính sách của hãng.

MySQL hoạt động thế nào bên trong?

Khi ứng dụng gửi một câu lệnh, nó đi qua nhiều lớp. Lớp kết nối xác thực tài khoản và cấp một luồng xử lý. Bộ phân tích cú pháp kiểm tra câu lệnh. Bộ tối ưu (optimizer) tính xem nên đọc bảng nào trước, dùng index nào, theo cách nào rẻ nhất. Cuối cùng, công cụ lưu trữ (storage engine) đọc hoặc ghi dữ liệu thật trên đĩa.

Kiến trúc MySQL gồm năm lớp từ trên xuống: ứng dụng gửi SQL; lớp kết nối và xác thực; bộ phân tích và tối ưu; storage engine InnoDB; file
Sơ đồ khái niệm về các lớp xử lý trong MySQL. Viền vàng là lớp quyết định truy vấn chạy nhanh hay chậm.

Lớp storage engine là nét riêng của MySQL: mỗi bảng có thể dùng một engine khác nhau. Hiện nay gần như mọi bảng dùng InnoDB, engine mặc định từ MySQL 5.5. InnoDB hỗ trợ giao dịch ACID, khoá ở mức dòng, khoá ngoại và tự khôi phục sau khi máy chủ sập nhờ redo log. Engine MyISAM cũ không có giao dịch và khoá cả bảng khi ghi, nên không còn phù hợp cho dữ liệu nghiệp vụ.

Hai loại log bạn nên biết sớm. Redo log của InnoDB bảo đảm không mất giao dịch đã xác nhận khi sự cố. Binary log ghi lại các thay đổi dữ liệu, dùng cho sao chép (replication) sang máy phụ và khôi phục theo thời điểm (point-in-time recovery).

Dữ liệu trong MySQL được tổ chức ra sao?

Một máy chủ MySQL chứa nhiều schema (còn gọi là database). Mỗi schema chứa nhiều bảng. Dữ liệu nằm trong bảng, và các bảng liên kết với nhau thông qua khoá (keys). Ví dụ minh hoạ: một cửa hàng online có bảng customers, bảng orders và bảng order_items. Cột customer_id trong orders trỏ về customers, đó là khoá ngoại. Cách chia bảng này gọi là chuẩn hoá, bạn có thể tìm hiểu rộng hơn ở bài mô hình hoá dữ liệu.

Các kiểu dữ liệu hay dùng gồm INT và BIGINT cho số nguyên, DECIMAL cho tiền tệ (không dùng FLOAT vì sai số làm tròn), VARCHAR cho chuỗi ngắn, DATETIME hoặc TIMESTAMP cho thời gian và JSON cho dữ liệu bán cấu trúc. Với tiếng Việt, bạn nên dùng bộ ký tự utf8mb4. Bộ utf8 cũ trong MySQL chỉ chứa tối đa 3 byte mỗi ký tự, nên không lưu được emoji và một số ký tự đặc biệt.

MySQL dùng cho việc gì trong doanh nghiệp Việt Nam?

  • Website và thương mại điện tử: WordPress và WooCommerce lưu bài viết, đơn hàng trong MySQL hoặc MariaDB. Đây là lý do nhiều gói hosting tại Việt Nam cài sẵn MySQL.
  • Ứng dụng nghiệp vụ nhỏ và vừa: ERP, CRM, phần mềm bán hàng, đặt lịch viết bằng PHP, Java, .NET hay Node.js đều có driver cho MySQL.
  • Dịch vụ cloud: các nhà cung cấp lớn đều có MySQL quản lý sẵn (Amazon RDS và Aurora, Google Cloud SQL, Azure Database for MySQL). Họ lo sao lưu và vá lỗi, bạn chỉ lo thiết kế bảng và truy vấn.
  • Nguồn dữ liệu cho phân tích: dữ liệu giao dịch trong MySQL thường được đưa sang kho dữ liệu qua quy trình ETL để báo cáo.

Cần lưu ý: MySQL là hệ thiên về giao dịch ghi và đọc từng dòng. Chạy báo cáo tổng hợp hàng trăm triệu dòng trực tiếp trên máy chủ giao dịch sẽ tranh tài nguyên với đơn hàng đang đặt. Sự khác biệt này được giải thích trong bài OLAP và OLTP.

Cách tối ưu truy vấn chậm trong MySQL

Đây là phần người dùng MySQL gặp nhiều nhất. Cách làm đáng tin là đi từ số đo: tìm truy vấn thật sự tốn thời gian, đọc kế hoạch thực thi, sửa đúng chỗ, rồi đo lại.

Quy trình sửa truy vấn chậm gồm năm bước: bật slow query log; chọn truy vấn tốn nhất; chạy EXPLAIN; thêm hoặc sửa index; đo lại bằng
Quy trình khái niệm, vòng lặp từ bước 5 quay lại bước 2 cho truy vấn tốn nhất kế tiếp.

Bước 1–2: bật slow query log và chọn đúng truy vấn

Slow query log ghi lại các câu lệnh chạy lâu hơn ngưỡng long_query_time. Mặc định ngưỡng này là 10 giây, quá cao cho ứng dụng web, nên nhiều đội hạ xuống 1 giây hoặc thấp hơn. Bạn bật bằng slow_query_log=ON, đặt long_query_time, rồi để chạy trong giờ cao điểm. Công cụ mysqldumpslow đi kèm MySQL, hoặc pt-query-digest của Percona, sẽ gom các câu giống nhau và xếp theo tổng thời gian.

Hãy chọn theo tổng thời gian, không theo từng lần chạy. Một câu 0,3 giây nhưng chạy 200.000 lần mỗi ngày tốn nhiều hơn hẳn một báo cáo 30 giây chạy mỗi tối. Ngoài ra, bảng sys.statement_analysis trong schema sys (bật sẵn từ MySQL 5.7) cho số liệu tương tự mà không cần đọc file log.

Bước 3: đọc kết quả EXPLAIN

Đặt từ khoá EXPLAIN trước câu SELECT, MySQL sẽ cho biết kế hoạch thực thi mà không chạy thật. Ví dụ minh hoạ trên bảng orders có vài triệu dòng:

EXPLAIN
SELECT id, total, created_at
FROM orders
WHERE customer_id = 1234
  AND created_at >= '2026-09-01'
ORDER BY created_at DESC
LIMIT 20;

Các cột cần đọc đầu tiên:

Cột Ý nghĩa Dấu hiệu cần xử lý
type Cách MySQL truy cập bảng Giá trị ALL nghĩa là quét toàn bộ bảng. Tốt hơn theo thứ tự: range, ref, eq_ref, const.
possible_keys / key Index có thể dùng và index thực sự được chọn key là NULL dù có điều kiện lọc.
rows Số dòng MySQL ước tính phải đọc Hàng triệu dòng để trả về 20 dòng.
filtered Tỷ lệ dòng còn lại sau điều kiện WHERE Rất thấp nghĩa là đọc nhiều, giữ ít.
Extra Ghi chú thêm Using filesort hoặc Using temporary khi truy vấn có ORDER BY, GROUP BY mà index không phục vụ được.

Trong ví dụ này, nếu bảng chưa có index phù hợp, bạn sẽ thấy type là ALL, key là NULL và rows xấp xỉ tổng số dòng của bảng. Đó là tín hiệu rõ nhất cho thấy thiếu index.

Bước 4: thêm index đúng thứ tự cột

Index trong InnoDB là cấu trúc cây B+ (B-tree). Nó giữ giá trị cột đã sắp xếp, nên MySQL nhảy thẳng đến vị trí cần tìm thay vì đọc cả bảng. Với ví dụ trên, bạn tạo index gộp:

CREATE INDEX idx_orders_customer_created
ON orders (customer_id, created_at);

Thứ tự cột quyết định hiệu quả. Index gộp chỉ dùng được từ cột đầu tiên trở đi (quy tắc tiền tố trái, leftmost prefix). Quy tắc thực dụng: cột lọc bằng dấu bằng đặt trước, cột lọc khoảng hoặc cột sắp xếp đặt sau. Ở đây customer_id lọc bằng, created_at vừa lọc khoảng vừa dùng để sắp xếp. Nhờ vậy MySQL đọc đúng 20 dòng đầu theo chiều ngược của index và bỏ được bước filesort.

Từ MySQL 8.0, bạn có thể tạo index ở trạng thái ẩn (invisible index). Index vẫn được cập nhật nhưng bộ tối ưu bỏ qua nó. Cách này cho phép kiểm tra một index có thật sự cần không trước khi xoá, và bật lại ngay nếu có truy vấn chậm đi.

Những kiểu viết làm index mất tác dụng

  • Bọc cột trong hàm: điều kiện WHERE DATE(created_at) = ‘2026-09-01’ không dùng được index trên created_at. Hãy viết thành khoảng: created_at >= ‘2026-09-01’ AND created_at < ‘2026-09-02’.
  • LIKE bắt đầu bằng dấu %: LIKE ‘%abc’ không tận dụng index thường vì không biết điểm bắt đầu. LIKE ‘abc%’ thì dùng được. Tìm kiếm văn bản dài nên dùng chỉ mục FULLTEXT.
  • So sánh khác kiểu: cột phone kiểu VARCHAR nhưng so với số 0912345678 (không có dấu nháy) khiến MySQL ép kiểu từng dòng và bỏ qua index. Hãy truyền chuỗi đúng kiểu.
  • Phân trang bằng OFFSET lớn: LIMIT 20 OFFSET 500000 buộc MySQL đọc rồi bỏ 500.000 dòng. Chuyển sang phân trang theo khoá: WHERE id < giá_trị_cuối_trang ORDER BY id DESC LIMIT 20.
  • SELECT *: kéo mọi cột, kể cả cột TEXT và BLOB, và chặn khả năng đọc chỉ từ index (covering index, hiện là Using index trong Extra).
  • Index cho cột ít giá trị khác nhau: cột trạng thái chỉ có 3 giá trị hiếm khi cho index đơn lẻ hiệu quả. Hãy đặt nó cùng cột có độ chọn lọc cao trong index gộp.

Index không miễn phí. Mỗi index làm câu INSERT, UPDATE, DELETE chậm đi vì phải cập nhật thêm cây, và chiếm dung lượng đĩa lẫn bộ nhớ đệm (buffer pool). Bảng ghi nhiều như bảng log giao dịch nên giữ index ở mức tối thiểu.

Bước 5: đo lại bằng EXPLAIN ANALYZE

EXPLAIN chỉ cho số ước tính. EXPLAIN ANALYZE, có từ MySQL 8.0, hỗ trợ tinh chỉnh truy vấn rất tốt, còn EXPLAIN cho phân tích ước tính từ phía máy chủ. EXPLAIN ANALYZE chạy truy vấn thật và báo thời gian cùng số dòng thực tế ở từng bước. Khi số dòng ước tính và thực tế lệch xa nhau, thống kê của bảng đã cũ, và lệnh ANALYZE TABLE giúp cập nhật. Lưu ý rằng EXPLAIN ANALYZE thực thi câu lệnh, nên bạn chỉ dùng với SELECT, không dùng với câu lệnh ghi trên môi trường thật.

Nên thử index trên bản sao của dữ liệu thật. Trên bảng nhỏ, bộ tối ưu có thể chọn quét cả bảng dù đã có index, nên kết luận ở máy phát triển dễ sai. Với bảng rất lớn, tạo index có thể kéo dài và tạo tải I/O, vì vậy hãy làm ngoài giờ cao điểm.

Nếu sau khi sửa index và câu lệnh mà truy vấn vẫn chậm, hãy xem xét ở tầng cao hơn: thiết kế bảng, bộ nhớ cấp cho buffer pool, đọc từ máy phụ (replica) cho các báo cáo, hoặc chuyển tải phân tích sang hệ khác. Nhiều đội còn so sánh với PostgreSQL khi cần truy vấn phân tích phức tạp.

Ưu điểm và hạn chế của MySQL

Ưu điểm Hạn chế
Miễn phí với bản Community, tài liệu và cộng đồng lớn, dễ tìm người làm. Bản Community không có một số tính năng của bản thương mại Enterprise do Oracle bán.
Triển khai dễ, có sẵn trên hầu hết hosting và dịch vụ cloud. Hỗ trợ ít kiểu dữ liệu và kiểu index nâng cao hơn PostgreSQL trong một số trường hợp.
InnoDB cung cấp giao dịch ACID, khoá dòng, khôi phục sau sự cố. Mở rộng ghi theo chiều ngang cần thiết kế riêng (phân mảnh dữ liệu), không có sẵn.
Sao chép (replication) giúp tách đọc và ghi, tạo máy dự phòng. Không phù hợp cho phân tích tổng hợp khối lượng lớn nếu chạy trên cùng máy giao dịch.

MySQL so với các lựa chọn gần

  • MySQL và MariaDB: cùng gốc mã nguồn, ban đầu thay thế qua lại được, nhưng nay mỗi bên có tính năng riêng. Trước khi chuyển, hãy kiểm thử ứng dụng.
  • MySQL và PostgreSQL: cả hai đều là cơ sở dữ liệu quan hệ mã nguồn mở. PostgreSQL mạnh về kiểu dữ liệu mở rộng và truy vấn phức tạp. MySQL nổi bật nhờ sự phổ biến và hệ sinh thái web. Chi tiết nằm trong bài riêng về PostgreSQL ở phần trên.
  • MySQL và NoSQL: nếu dữ liệu có quan hệ rõ ràng và cần giao dịch chính xác như đơn hàng, thanh toán, tồn kho, hệ quan hệ là lựa chọn tự nhiên. Khi dữ liệu linh hoạt về cấu trúc hoặc cần mở rộng ghi rất lớn, bạn nên xem bài SQL và NoSQL khác nhau.

Khi nào nên và không nên chọn MySQL?

MySQL hợp với ứng dụng web, thương mại điện tử và phần mềm nghiệp vụ có mô hình dữ liệu rõ, khối lượng từ vài chục nghìn đến hàng trăm triệu dòng, và đội phát triển đã quen SQL. Nó cũng hợp khi bạn muốn dùng dịch vụ quản lý sẵn trên cloud để giảm công vận hành.

Bạn nên cân nhắc hệ khác khi cần phân tích cột trên hàng tỷ dòng (kho dữ liệu dạng cột), khi dữ liệu chủ yếu là tài liệu JSON tự do, hoặc khi nghiệp vụ cần các kiểu dữ liệu và chỉ mục chuyên biệt mà MySQL không có. Nếu đang chạy 5.7 hoặc 8.0 trên máy tự quản, hãy xếp lịch nâng cấp lên 8.4 LTS, vì hai bản này đã hết vòng đời.

Câu hỏi thường gặp

MySQL có miễn phí không?

Có. Bản Community Server phát hành theo giấy phép GPL, tải về dùng miễn phí. Oracle còn bán bản Enterprise Edition có thêm công cụ sao lưu, giám sát và hỗ trợ kỹ thuật. Nếu nhúng MySQL vào sản phẩm phân phối lại, bạn nên đọc kỹ điều khoản giấy phép.

MySQL và SQL khác nhau thế nào?

SQL là ngôn ngữ truy vấn chuẩn. MySQL là phần mềm quản trị cơ sở dữ liệu hiểu và thực thi SQL, kèm các mở rộng riêng. Học SQL một lần dùng được cho nhiều hệ, còn tối ưu truy vấn thì phụ thuộc từng hệ.

Truy vấn MySQL chậm thì kiểm tra gì trước?

Hãy bật slow query log để biết truy vấn nào thật sự chậm, rồi chạy EXPLAIN. Nếu thấy type là ALL hoặc key là NULL, thường là thiếu index hoặc câu lệnh làm mất index, như bọc cột trong hàm hay so sánh sai kiểu.

Thêm nhiều index có làm MySQL nhanh hơn không?

Không phải lúc nào cũng vậy. Index giúp đọc nhanh nhưng làm ghi chậm hơn và tốn dung lượng. Chỉ nên giữ index phục vụ truy vấn có thật. Với index nghi ngờ thừa, bạn có thể ẩn nó trước (MySQL 8.0 trở lên) để xem tác động rồi mới xoá.

Nên dùng MySQL bản nào hiện nay?

Với hệ thống mới, chọn bản LTS: 8.4 LTS (hỗ trợ đến tháng 4/2032) hoặc 9.7 LTS ra tháng 4/2026. MySQL 5.7 đã hết vòng đời từ tháng 10/2023 và 8.0 hết từ tháng 4/2026, nên không còn nhận bản vá bảo mật từ Oracle.

MySQL có xử lý được dữ liệu lớn không?

MySQL xử lý tốt dữ liệu giao dịch ở quy mô lớn nếu thiết kế bảng và index hợp lý, kết hợp sao chép để tách tải đọc. Với phân tích khối lượng rất lớn, người ta thường đưa dữ liệu sang kho riêng, bạn có thể tham khảo bài big data là gì để hiểu khi nào cần kiến trúc khác.

VBPO cập nhật tin tức và kiến thức công nghệ cho doanh nghiệp Việt Nam. Xem thêm các bài cùng chuyên mục Dữ liệu & phân tích.