ไลบรารีที่ใช้

  • craw: โซลูชันที่อิงกับ CGO ไม่ใช่ไดรเวอร์ database/sql
  • mattn: โซลูชันที่อิงกับ CGO ยังเป็น de-facto standard และมีการใช้งานอย่างแพร่หลาย
  • modernc: โซลูชัน Go ล้วน เป็นไลบรารีใหม่ที่อิงจากโค้ดที่เขียนโค้ด SQLite C ใหม่เป็น Go
  • ncruces: โซลูชัน Go ล้วนที่อิงกับ WASM
  • sqinn: โซลูชันที่ไม่ใช้ CGO ใช้ github.com/cvilsmeier/sqinn เพื่อเข้าถึงไฟล์ฐานข้อมูล SQLite DB
  • zombie: สิ่งที่นำไดรเวอร์ crawshaw มาเขียนใหม่โดยใช้ไลบรารี modernc ไม่ใช่ไดรเวอร์ database/sql

เบนช์มาร์ก

  • สร้างฐานข้อมูลทดสอบที่ประกอบด้วย user/article/comment
  • สร้างและค้นหาผู้ใช้ 1 ล้านคน
    • 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
  • คิวรีซับซ้อน: สร้างผู้ใช้ 200 คนในหนึ่งทรานแซกชัน, สร้างบทความ 100 ชิ้นต่อผู้ใช้ในอีกทรานแซกชันหนึ่ง, และสร้างคอมเมนต์ 20 รายการต่อบทความในอีกทรานแซกชันหนึ่ง จากนั้นคิวรีทั้งหมดด้วย JOIN
    • 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:
  • การค้นหาจำนวนมาก (Many): แทรกผู้ใช้ N คนลงในหนึ่ง database transaction แล้วค้นหา 1000 ครั้ง
    • 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
  • ข้อมูลขนาดใหญ่ (Large): แทรกผู้ใช้ 10,000 คนและเนื้อหาแถวขนาด N ไบต์ แล้วค้นหาผู้ใช้ทั้งหมด
    • 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
  • การทำงานพร้อมกัน (Concurrent): หลังจากแทรกผู้ใช้ 1 ล้านคนแล้ว ให้ค้นหาผู้ใช้ทั้งหมดด้วย goroutine จำนวน N ตัว
    • 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

สรุป

  • ตัดสินว่าอะไรดีกว่าอย่างชัดเจนไม่ได้ ทุกอย่างขึ้นอยู่กับ use case
  • Crawshaw และ Zombiezen ค่อนข้างเร็ว
  • แม้ Mattn จะเป็นมาตรฐานโดยพฤตินัย แต่ก็ไม่ใช่โซลูชันที่ดีที่สุดโดยรวม
  • SQLite แบบไม่มี CGO ก็เป็นไปได้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น