3 điểm bởi xguru 2023-12-16 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Các thư viện đã dùng

  • craw: giải pháp dựa trên CGO. Không phải driver database/sql
  • mattn: giải pháp dựa trên CGO. Vẫn là tiêu chuẩn de-facto và được dùng nhiều
  • modernc: giải pháp Go thuần. Thư viện mới với nền tảng mã đã viết lại mã C của SQLite sang Go
  • ncruces: giải pháp Go thuần dựa trên WASM
  • sqinn: giải pháp không dùng CGO. Sử dụng github.com/cvilsmeier/sqinn để truy cập file DB SQLite
  • zombie: bản viết lại của driver crawshaw bằng thư viện modernc. Không phải driver database/sql

Benchmark

  • Tạo DB kiểm thử gồm user/article/comment
  • Tạo và truy vấn 1 triệu người dùng
    • insert : sqinn 883ms > craw 1234ms > mattn 1537ms > zombie 1862ms > modernc 5557ms > ncruces 10073ms
    • query : zombie 325ms > craw 608ms > sqinn 641ms > mattn 1267ms > modernc 1379ms > ncruces 6080ms
  • Truy vấn phức tạp: trong một transaction tạo 200 người dùng, trong transaction khác tạo 100 article cho mỗi người dùng, và trong một transaction khác tạo 20 comment cho mỗi article. JOIN mọi thứ để truy vấn
    • insert : sqinn 574 > craw 729ms > mattn 911ms > zombie 1400ms > modernc 3211ms > ncruces 5159ms
    • query : zombie 507ms > craw 667ms > sqinn 709ms > mattn 1387ms > modernc 1633ms > ncruces 5380ms
      Here are the remaining sections of the "go-sqlite-bench" GitHub repository summary in the requested format:
  • Nhiều truy vấn (Many): chèn N người dùng vào một transaction cơ sở dữ liệu, sau đó truy vấn 1000 lần
    • query/N=10 : zombie 17ms > craw 14ms > sqinn 25ms > mattn 30ms > modernc 35ms > ncruces 185ms
    • query/N=100 : zombie 36ms > craw 65ms > sqinn 83ms > mattn 130ms > modernc 135ms > ncruces 829ms
    • query/N=1000 : zombie 225ms > craw 520ms > sqinn 619ms > mattn 1143ms > modernc 1180ms > ncruces 7230ms
  • Dữ liệu lớn (Large): chèn 10.000 người dùng và nội dung hàng có kích thước N byte, sau đó truy vấn tất cả người dùng
    • query/N=50000 : mattn 168ms > craw 197ms > ncruces 244ms > modernc 276ms > zombie 552ms > sqinn 519ms
    • query/N=100000 : mattn 290ms > craw 346ms > ncruces 391ms > modernc 514ms > zombie 1071ms > sqinn 1085ms
    • query/N=200000 : mattn 591ms > craw 624ms > ncruces 789ms > modernc 888ms > zombie 2198ms > sqinn 2264ms
  • Đồng thời (Concurrent): sau khi chèn 1 triệu người dùng, dùng N goroutine để truy vấn tất cả người dùng
    • query/N=2 : zombie 367ms > craw 692ms > sqinn 854ms > mattn 1516ms > modernc 2889ms > ncruces 8268ms
    • query/N=4 : zombie 646ms > craw 1100ms > sqinn 1411ms > mattn 1840ms > modernc 7144ms > ncruces 12710ms
    • query/N=8 : zombie 1140ms > craw 1873ms > sqinn 2460ms > mattn 3483ms > modernc 18674ms > ncruces 25792ms

Tóm tắt

  • Không thể phân định hơn kém rõ ràng; mọi thứ đều phụ thuộc vào use case
  • Crawshaw và Zombiezen khá nhanh
  • Mattn là tiêu chuẩn thực tế, nhưng nhìn chung không phải giải pháp tốt nhất
  • SQLite không có CGO cũng khả thi

Chưa có bình luận nào.

Chưa có bình luận nào.