Drizzle và Prisma trên VPS: ORM nào nặng ổ đĩa hơn

Chia sẻ bài viết

Mục lục
Drizzle và Prisma trên VPS: ORM nào nặng ổ đĩa hơn

Trả lời nhanh: Prisma có bước sinh mã trước khi chạy, bước này đọc ghi ổ đĩa và tốn thời gian mỗi lần đổi lược đồ dữ liệu. Drizzle không có bước sinh nặng như vậy nên khởi động nhanh hơn và chiếm ít dung lượng hơn. Ở khâu truy vấn thật thì khác biệt nhỏ, vì thời gian chủ yếu nằm ở database chứ không nằm ở lớp ORM. Nếu bạn đổi lược đồ dữ liệu liên tục khi vibe code, khác biệt ở bước sinh mã là thứ cảm nhận rõ nhất.

Vibe code nghĩa là đổi lược đồ dữ liệu liên tục. Mỗi lần đổi lại phải chạy lại bước sinh mã, và đó là chỗ hai công cụ khác nhau rõ nhất.

Tóm tắt nhanh
  • Prisma có bước sinh mã, tốn thời gian và dung lượng mỗi lần đổi lược đồ.
  • Drizzle nhẹ hơn ở khâu này nên vòng lặp sửa và thử ngắn hơn.
  • Ở khâu truy vấn thật, thời gian chủ yếu nằm ở database chứ không ở ORM.
  • Chọn theo cách bạn làm việc, không chọn theo con số so sánh chung.

Ba khâu và chỗ khác biệt

KhâuPrismaDrizzle
Sinh mã sau khi đổi lược đồCó bước riêng, tốn thời gian và ổ đĩaNhẹ hơn nhiều
Khởi động ứng dụngChậm hơn một chútNhanh
Chạy truy vấnKhác biệt nhỏKhác biệt nhỏ
Dung lượng chiếmLớn hơn do mã sinh raNhỏ hơn

Điểm quan trọng ở hàng thứ ba: khi truy vấn thật sự chạy, thời gian nằm ở database đọc dữ liệu chứ không nằm ở lớp ORM. Đây là lý do tối ưu chỉ mục và dùng ổ nhanh có tác dụng lớn hơn nhiều so với đổi ORM.

Vì sao vibe code làm khác biệt này lộ rõ

Cách làm truyền thống: thiết kế lược đồ dữ liệu một lần, sau đó ít khi đổi. Bước sinh mã chạy vài lần mỗi tuần, không ai để ý.

Vibe code thì ngược lại: agent đề xuất thêm bảng, đổi cột, thêm quan hệ liên tục trong một buổi. Bước sinh mã chạy vài chục lần. Khi đó mỗi lần chậm mười giây thành vài phút chờ cộng dồn trong ngày.

Điều đáng làm hơn cả việc chọn ORM

  1. Đánh chỉ mục đúng. Ảnh hưởng tới tốc độ truy vấn lớn hơn mọi lựa chọn ORM.
  2. Đặt bộ nhớ đệm database đủ lớn. Mặc định thường quá nhỏ so với RAM có sẵn.
  3. Dùng ổ NVMe. Database đọc ghi ngẫu nhiên, đúng chỗ NVMe mạnh.
  4. Đặt database cùng máy với ứng dụng khi đang phát triển, bỏ hẳn độ trễ mạng.

Làm bốn việc này rồi thì chọn ORM nào cũng chạy nhanh. Bỏ qua chúng thì đổi ORM cũng không cứu được.

Đo trên chính dự án của bạn

# Do khau sinh ma va khoi dong, khau chenh nhieu nhat
time npx prisma generate
time npx drizzle-kit generate

# Do kich thuoc thu muc thu vien sau khi cai
du -sh node_mod*/.prisma node_mod*/@prisma 2>/dev/null
du -sh node_mod*/drizzle-orm 2>/dev/null

# Do thoi gian khoi dong ung dung
time node -e "require('./dist/index.js')"

# Do so thao tac doc tep trong luc khoi dong
strace -c -f -e trace=openat node dist/index.js 2>&1 | tail -5

Lệnh cuối là lệnh cho câu trả lời trực tiếp nhất về câu hỏi cái nào nặng ổ đĩa hơn: nó đếm số lần mở tệp. Con số này là thứ quyết định thời gian khởi động trên ổ chậm.

Bảng so ba khâu bị ảnh hưởng

KhâuChỗ khác biệtẢnh hưởng thực tế
Cài thư việnMột bên sinh thêm mã và tệp nhị phân theo nền tảngThư mục thư viện lớn hơn, cài lâu hơn
Sinh mã sau khi đổi lược đồBên sinh mã phải chạy lại mỗi lần đổiVới dự án đổi lược đồ liên tục, đây là phần cộng dồn
Khởi động ứng dụngSố tệp phải đọc khác nhauRõ nhất trên ổ chậm và trong container nhỏ

Vì sao cách làm việc với trợ lý làm khác biệt này lộ rõ

Khi làm việc với trợ lý lập trình, chu kỳ đổi lược đồ, sinh lại mã, chạy thử lặp lại rất nhiều lần trong một buổi. Mỗi vòng chậm thêm mười giây thì một buổi mất thêm khá nhiều thời gian chờ. Đây là lý do khác biệt vốn nhỏ trên giấy lại cảm nhận được rõ trong thực tế.

Điều đáng làm hơn cả việc chọn

  • Dùng ổ NVMe. Cả hai khâu nặng nhất đều là đọc ghi nhiều tệp nhỏ, đúng thế mạnh của ổ này.
  • Giữ bộ nhớ đệm thư viện giữa các lần dựng, nhất là khi chạy trong container.
  • Loại thư mục thư viện khỏi phạm vi quét của trợ lý, việc rẻ nhất và hiệu quả nhất.
  • Chỉ sinh lại mã khi lược đồ thật sự đổi, đừng đưa nó vào mọi lần chạy.

Kết luận thực dụng: chọn theo thứ đội bạn quen dùng và theo tính năng cần, không theo tốc độ. Khác biệt do phần cứng và do cách tổ chức dự án lớn hơn nhiều.

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

ORM nào nhanh hơn?

Ở khâu truy vấn thật thì khác biệt nhỏ vì thời gian nằm ở database. Khác biệt rõ nằm ở bước sinh mã sau khi đổi lược đồ dữ liệu.

Đổi ORM giữa dự án có nên không?

Chỉ khi có lý do rõ ràng ngoài tốc độ, vì phải viết lại toàn bộ tầng truy cập dữ liệu và chạy lại đủ test.

ORM có ăn nhiều RAM không?

Không đáng kể so với database. Phần RAM lớn nhất trong hệ thống gần như luôn là bộ nhớ đệm của database.

Ổ NVMe giúp gì cho ORM?

Giúp ở hai chỗ: bước sinh mã ghi nhiều file, và database đọc dữ liệu khi truy vấn. Cả hai đều là đọc ghi file nhỏ.

Hạ tầng NVMe Enterprise của TND
VPS ổ Enterprise U.2 NVMe, CPU xung cao, đặt tại Việt Nam
Truy vấn SQL, PHP dựng trang, build Next.js hay đóng gói app iOS và Android: phần lớn các bước này chạy đơn luồng và đập liên tục vào ổ đĩa. Nghẽn nằm ở tốc độ đọc ghi và xung nhịp CPU, không phải ở việc có thật nhiều nhân. Ổ Enterprise U.2 NVMe chuẩn máy chủ chạy RAID 10 cho IOPS đọc ghi ngẫu nhiên gấp 5 đến 7 lần ổ SATA SSD, khác hẳn NVMe M.2 phổ thông. Chạy trên chip Intel Xeon Platinum dòng xung cao, backup tự động hàng tuần, bàn giao trong 5 phút.
Xem VPS ổ Enterprise U.2 NVMe, bàn giao trong 5 phút

Bài viết liên quan