6 điểm bởi GN⁺ 2024-04-10 | 1 bình luận | Chia sẻ qua WhatsApp
  • Công cụ cơ sở dữ liệu tương thích MySQL được viết hoàn toàn bằng Go
  • Đây là một SQL engine không phụ thuộc vào nguồn dữ liệu, sử dụng cú pháp và giao thức MySQL để thực thi truy vấn trên nguồn dữ liệu được cung cấp
  • Đi kèm một triển khai cơ sở dữ liệu in-memory đơn giản, và bạn cũng có thể tự triển khai backend để truy vấn nguồn dữ liệu mong muốn

Tính tương thích

  • Ngoại trừ một số giới hạn nhất định, go-mysql-server có thể được dùng như một sự thay thế cho MySQL
  • Các thư viện client, công cụ, truy vấn, cú pháp SQL, hàm SQL... hoạt động trên MySQL cũng nên hoạt động trên go-mysql-server
  • Nếu phát hiện khác biệt về tính năng, hãy gửi issue

Phạm vi dự án

  • SQL server và engine để truy vấn nguồn dữ liệu
  • Triển khai backend cơ sở dữ liệu in-memory phù hợp để dùng trong kiểm thử
  • Các interface có thể dùng để triển khai backend mới nhằm truy vấn nguồn dữ liệu riêng
  • Nếu lưu ý một số điểm nhất định và sử dụng triển khai cơ sở dữ liệu đầy đủ, nó có thể thay thế cơ sở dữ liệu MySQL

Các trường hợp sử dụng chính của go-mysql-server:

  1. Dùng triển khai cơ sở dữ liệu memory tích hợp sẵn để thay thế MySQL trong môi trường kiểm thử Go
  2. Triển khai một vài interface để cho phép truy cập nguồn dữ liệu bất kỳ bằng truy vấn SQL

Sử dụng máy chủ kiểm thử in-memory

  • Máy chủ kiểm thử in-memory có thể thay thế máy chủ MySQL thực trong quá trình kiểm thử
  • Có thể khởi động máy chủ bằng mã ví dụ được cung cấp
  • Khi máy chủ chạy, có thể kết nối bằng MySQL client, Go MySQL connector, mysql shell, v.v.

Các giới hạn của triển khai cơ sở dữ liệu in-memory

  • Triển khai cơ sở dữ liệu in-memory đi kèm được dùng cho mục đích kiểm thử
  • Các giới hạn đã biết:
    • Không thread-safe. Để tránh vấn đề đồng thời, cần giới hạn các câu lệnh DDL và DML trong một goroutine duy nhất
    • Không hỗ trợ transaction. Các câu lệnh như START TRANSACTION, ROLLBACK, COMMIT sẽ không hoạt động
    • Triển khai chỉ mục kém hiệu quả. Tra cứu chỉ mục và join sẽ thực hiện full table scan trên các bảng nội bộ

Triển khai backend tùy chỉnh

  • Có thể tạo backend để truy vấn nguồn dữ liệu riêng bằng cách triển khai một số interface
  • Xem hướng dẫn backend để biết thêm chi tiết

Các dự án chạy trên go-mysql-server

  • dolt
  • gitbase (đã ngừng)
  • Nếu bạn đang xây dựng backend cơ sở dữ liệu bằng go-mysql-server, hãy cho biết

Giấy phép

  • Apache License 2.0

Ý kiến của GN⁺

  • go-mysql-server có vẻ là một công cụ cơ sở dữ liệu nhẹ, tương thích MySQL, được viết bằng Go; hữu ích để thay thế MySQL trong môi trường kiểm thử hoặc để truy vấn nguồn dữ liệu riêng bằng SQL
  • Vì hướng tới tính tương thích với MySQL, có thể kỳ vọng áp dụng cho các ứng dụng hiện có dựa trên MySQL mà không cần chỉnh sửa quá nhiều
  • Tuy vậy, đây vẫn là một dự án mang tính thử nghiệm; đặc biệt phần triển khai in-memory chỉ phù hợp cho kiểm thử, nên khi áp dụng vào production cần lưu ý về hiệu năng và độ ổn định
  • Với các backend developer, việc có thể tự triển khai interface để kết nối nguồn dữ liệu mong muốn là một điểm hấp dẫn. Có thể tham khảo các dự án thực tế như Dolt
  • Các cơ sở dữ liệu tương thích MySQL tương tự có thể kể đến TiDB, CockroachDB, v.v. go-mysql-server có ưu điểm là cho phép tự do triển khai backend, nhưng đổi lại cũng có nhược điểm là phát sinh thêm chi phí phát triển backend

1 bình luận

 
GN⁺ 2024-04-10
Ý kiến trên Hacker News
  • Là engine truy vấn vận hành Dolt nên go-mysql-server là phần quan trọng nhất
  • Tôi đã viết phần lớn mã của Dolt nhưng không phải tác giả gốc. Câu chuyện về bối cảnh khởi đầu dự án khá thú vị
  • Ý tưởng của Dolt hấp dẫn, nhưng đây là một persistence layer quá khác biệt và quá quan trọng nên chưa đủ để xây dựng doanh nghiệp trên đó. Tuy vậy, sẽ rất hay nếu các DB dòng chính áp dụng nó
  • Nếu hỗ trợ từ MySQL sang PostgreSQL và SQLite tiếp tục phát triển, thì WordPress và các hệ thống tương tự có thể hỗ trợ nhiều DB engine
  • Có vẻ đây là một wire-protocol proxy từ MySQL sang SQL. DB được proxy mặc định là Dolt, và có lẽ dự án này được tách ra từ Dolt
  • Go có thể tốt hơn, nhưng từ góc nhìn của một lập trình viên C#, việc triển khai DB bằng ngôn ngữ GC vẫn đáng lo. Bạn sẽ phải vật lộn với GC và viết rất nhiều mã cấp phát thấp không hề hiển nhiên. Với đội nhỏ thì có thể ổn, nhưng sẽ khó tuyển được lập trình viên có kỹ năng phù hợp
  • Tính tương thích và tính năng còn rất hạn chế nên khó dùng trong production (không hỗ trợ transaction, triển khai index kém hiệu quả, v.v.). Cũng tò mò không biết có hỗ trợ trigger, stored procedure hay không
  • Không rõ sẽ khó đến mức nào nếu dùng nó làm phương án thay thế MySQL in-memory để test dự án Rails. Tầng DB rất quan trọng nên cần cẩn thận trong production, nhưng nếu có thể tăng tốc độ test thì sẽ khá thú vị
  • TiDB là DB phân tán tương thích MySQL được viết bằng Go và Rust, còn StarRocks là DB OLAP tương thích MySQL được viết bằng Java và C++. Nhưng có vẻ dự án này đang tiếp cận theo một góc nhìn khác. Vì thư viện MySQL của Vitess khó dùng, có thể nó sẽ được dùng để xây dựng các lớp trừu tượng như ORM
  • Những triển khai kiểu này thật đáng kinh ngạc, nhưng vẫn chưa rõ liệu có trường hợp sử dụng thực tế nào không
  • Có người đề xuất rằng thay vì MySQL thì nên tuân thủ SQL chuẩn