Postgres và MySQL: So sánh toàn diện 2023

 Kết quả khảo sát Stack Overflow năm 2023 cho thấy Postgres đã vượt lên dẫn đầu so với MySQL và trở thành cơ sở dữ liệu được ngưỡng mộ và mong muốn nhất. 

Khi Postgres ngày càng phổ biến, việc lựa chọn giữa Postgres và MySQL cũng trở nên khó khăn hơn. MySQL có lẽ vẫn là cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới về cài đặt.

Trong khi đó, Postgres định vị mình là cơ sở dữ liệu quan hệ mã nguồn mở tiên tiến nhất thế giới.

Dựa trên kinh nghiệm vận hành, chúng tôi đưa ra một so sánh rộng rãi giữa Postgres và MySQL từ các khía cạnh sau:

- **Giấy phép**

- **Mô hình kết nối** 

- **Hiệu năng**

- **Tính năng**

    - Hệ thống đối tượng

    - Giao dịch ACID

    - Bảo mật

    - Trình tối ưu hóa truy vấn

    - Nhân bản

    - JSON

    - CTE (Biểu thức bảng chung)

    - Hàm window

- **Khả năng mở rộng**

- **Tính dễ sử dụng**

- **Khả năng vận hành** 

- **Hệ sinh thái**

## Giấy phép

- MySQL phiên bản cộng đồng được cấp phép theo GPL.

- Postgres được phát hành dưới Giấy phép PostgreSQL tự do tương tự như giấy phép BSD hoặc MIT.

Mặc dù MySQL sử dụng GPL, một số người vẫn lo ngại về việc MySQL thuộc sở hữu của Oracle. Đó cũng là lý do MariaDB được tách ra từ MySQL.

## Mô hình kết nối

Postgres sử dụng mô hình quy trình trên mỗi kết nối nơi mỗi kết nối tạo một tiến trình mới. MySQL sử dụng mô hình luồng trên mỗi kết nối nơi mỗi kết nối tạo một luồng mới. Do đó, Postgres cung cấp sự cô lập tốt hơn, ví dụ một lỗi truy cập bộ nhớ không hợp lệ chỉ làm sập một tiến trình duy nhất thay vì toàn bộ máy chủ cơ sở dữ liệu. Mặt khác, mô hình tiến trình tiêu thụ nhiều tài nguyên hơn. Vì vậy, đối với triển khai Postgres trên quy mô lớn, khuyên dùng proxy kết nối thông qua bộ điều phối kết nối như PgBouncer hoặc pgcat.

## Hiệu năng 

Đối với hầu hết các tải công việc, hiệu năng giữa Postgres và MySQL tương đương nhau với độ lệch tối đa 30%. Mặt khác, bất kể bạn chọn cơ sở dữ liệu nào, nếu truy vấn của bạn bỏ sót chỉ mục, nó có thể giảm hiệu suất 10 lần hoặc thậm chí 1000 lần. 

Nói điều đó, MySQL có lợi thế hơn Postgres đối với các tải công việc ghi cực kỳ cao. Bạn có thể đọc các bài viết sau để biết chi tiết:

- **Tại sao Uber Engineering chuyển từ Postgres sang MySQL**

- **Phần của PostgreSQL chúng tôi ghét nhất**

Trừ khi doanh nghiệp của bạn đạt quy mô tương tự như Uber, hiệu suất cơ sở dữ liệu không phải là yếu tố quyết định. Các công ty như Instagram, Notion cũng có thể vận hành Postgres ở quy mô siêu lớn.

## Tính năng

### Hệ thống đối tượng 

MySQL sử dụng hệ thống 4 cấp:

1. Thể hiện 

2. Cơ sở dữ liệu

3. Bảng

4. Cột

Postgres sử dụng hệ thống 5 cấp:

1. Thể hiện (còn gọi là cụm)

2. Cơ sở dữ liệu 

3. Schema

4. Bảng

5. Cột

### Giao dịch ACID

Cả hai cơ sở dữ liệu đều hỗ trợ giao dịch ACID. Nhìn chung, Postgres cung cấp hỗ trợ giao dịch mạnh mẽ hơn:

- MySQL hỗ trợ giao dịch DML trước phiên bản 8.0. 

- Từ MySQL 8.0 hỗ trợ giao dịch DML.

- MySQL không hỗ trợ giao dịch DDL trước phiên bản 8.0.

- Từ MySQL 8.0 hỗ trợ DDL giao dịch nguyên tử đơn giản.

- Postgres hỗ trợ giao dịch DML.

- Postgres hỗ trợ giao dịch DDL.

### Bảo mật

Cả Postgres và MySQL đều hỗ trợ RBAC.

Postgres hỗ trợ thêm Bảo mật cấp hàng (RLS) ngay ra khỏi hộp, trong khi MySQL cần tạo các lược đồ bổ sung để mô phỏng hành vi này.

### Trình tối ưu hóa truy vấn 

Postgres có trình tối ưu hóa truy vấn tốt hơn. Xem chi tiết hơn trong bài viết này.

### Nhân bản

Đối với Postgres, nhân bản chuẩn là nhân bản vật lý bằng WAL. Đối với MySQL, nhân bản chuẩn là nhân bản logic bằng binlog.

Postgres cũng hỗ trợ nhân bản logic thông qua chế độ Publish/Subscribe.

### JSON

Cả Postgres và MySQL đều hỗ trợ cột JSON. Postgres hỗ trợ nhiều tính năng hơn:

- Nhiều toán tử hơn để truy cập các tính năng JSON.

- Cho phép tạo chỉ mục trên các trường JSON. 

### CTE (Biểu thức bảng chung)

Postgres có hỗ trợ CTE toàn diện hơn:

- SELECT, UPDATE, INSERT, DELETE bên trong CTE.

- SELECT, UPDATE, INSERT, DELETE sau CTE.

MySQL hỗ trợ:

- SELECT bên trong CTE. 

- SELECT, UPDATE và DELETE sau CTE.

### Hàm window

Các kiểu khung window: MySQL chỉ hỗ trợ kiểu khung ROWS, cho phép bạn xác định một khung bao gồm một số hàng cố định. Postgres, mặt khác, hỗ trợ cả hai kiểu khung ROWS và RANGE.

Đơn vị phạm vi: MySQL chỉ hỗ trợ các đơn vị phạm vi UNBOUNDED PRECEDING và CURRENT ROW, trong khi Postgres hỗ trợ nhiều đơn vị phạm vi hơn, bao gồm UNBOUNDED FOLLOWING và BETWEEN.

Hiệu năng: Nói chung, cài đặt hàm window của Postgres được coi là hiệu quả và mạnh mẽ hơn so với cài đặt của MySQL. 

## Khả năng mở rộng

Postgres hỗ trợ các tiện ích mở rộng. Tiện ích nổi bật nhất là PostGIS mang lại khả năng Địa lý không gian cho Postgres. Ngoài ra còn có Foreign Data Wrapper (FDW) để truy vấn vào các hệ thống dữ liệu khác, pg_stat_statements để theo dõi thống kê lập kế hoạch và thực thi, và thậm chí pgvector để thực hiện tìm kiếm vector cho các ứng dụng AI.

MySQL có kiến trúc engine lưu trữ có thể cắm và tạo ra InnoDB. Nhưng ngày nay, InnoDB đã trở thành engine lưu trữ chiếm ưu thế trong MySQL, vì vậy kiến trúc có thể cắm chỉ phục vụ như một ranh giới API thay vì được sử dụng cho mục đích mở rộng.

Đối với xác thực, cả Postgres và MySQL đều hỗ trợ mô-đun xác thực có thể cắm (PAM).

## Tính dễ sử dụng

Postgres nghiêm ngặt hơn trong khi MySQL tha thứ hơn:

- MySQL cho phép bao gồm các cột không tổng hợp trong một câu SELECT sử dụng điều kiện GROUP BY. Postgres thì không.

- MySQL không phân biệt chữ hoa chữ thường theo mặc định. Postgres phân biệt chữ hoa chữ thường theo mặc định. 

MySQL cho phép nối các bảng từ các cơ sở dữ liệu khác nhau. Postgres chỉ có thể nối các bảng bên trong cùng một cơ sở dữ liệu, trừ khi sử dụng tiện ích mở rộng FDW.

## Khả năng vận hành

Do thiết kế công nghệ lưu trữ cơ bản, Postgres có vấn đề vòng đời XID nổi tiếng dưới tải nặng. 

Đối với MySQL, chúng tôi gặp một vài lỗi nhân bản khi vận hành một đội MySQL khổng lồ tại Google Cloud.

Những vấn đề đó chỉ xảy ra ở tải cực cao. Đối với tải công việc bình thường, cả Postgres và MySQL đều trưởng thành và đáng tin cậy. Nền tảng lưu trữ cơ sở dữ liệu cũng cung cấp tính năng sao lưu/khôi phục, giám sát tích hợp.

## Hệ sinh thái

Tất cả các công cụ SQL phổ biến đều hỗ trợ tốt cả Postgres và MySQL. Do kiến trúc mở rộng và thực tế Postgres vẫn thuộc sở hữu của cộng đồng, hệ sinh thái của Postgres phát triển mạnh mẽ hơn trong những năm gần đây. Đối với mọi nền tảng ứng dụng cung cấp dịch vụ cơ sở dữ liệu lưu trữ, họ đều chọn Postgres. Từ Heroku trong những ngày đầu đến Supabase, Render, Fly.io mới đây.

## Postgres hay MySQL

Tóm lại, Postgres có nhiều tính năng hơn, cộng đồng và hệ sinh thái phát triển mạnh mẽ hơn. Trong khi MySQL có độ dốc học tập dễ dàng hơn và cơ sở người dùng lớn hơn.

Chúng tôi quan sát thấy xu hướng ngành giống như kết quả khảo sát Stack Overflow rằng Postgres ngày càng được các nhà phát triển ưa chuộng hơn. Nhưng từ kinh nghiệm vận hành của chúng tôi, sự phức tạp của Postgres đổi lại một chút tính thuận tiện. Nếu bạn chưa quen với Postgres, chúng tôi đề nghị bạn khởi động một thể hiện từ nhà cung cấp cloud, chạy một vài truy vấn để có cảm nhận. Đôi khi, những tiện ích bổ sung đó không đáng giá và MySQL sẽ là lựa chọn dễ dàng hơn.

Nói tóm lại, cả Postgres và MySQL đều là những lựa chọn cơ sở dữ liệu tuyệt vời. Việc lựa chọn phụ thuộc vào nhu cầu cụ thể của từng dự án. Hãy cân nhắc kỹ các ưu nhược điểm cũng như yêu cầu về hiệu năng, tính năng, vận hành và hệ sinh thái để đưa ra quyết định phù hợp nhất.

Comments

Popular posts from this blog

Cách sử dụng Redis Cache để ngăn chặn các cuộc tấn công DDoS

Hướng dẫn cài đặt và cấu hình OrientDB trên Ubuntu 22.04 LTS

Hướng dẫn sao lưu cơ sở dữ liệu SQLite định kỳ trên iCloud dành cho Data Scientist