Yêu cầu thg 6 6, 2018 9:29 SA 1307 1 2
  • 1307 1 2
+3

Vấn đề về soft delete ảnh hưởng đến performance trong Laravel

Chia sẻ
  • 1307 1 2

Chào mọi người, dự án mình đang làm dùng Laravel và gặp vấn đề khá thốn như này, lúc mới bắt đầu thiết kế database thì mọi người thống nhất là dùng soft delete cho tất cả các tables, bởi vì nếu có table dùng, table không dùng thì khi delete hay restore thì sẽ gặp rũi ro. Nhưng hiện tại khi dự án lớn lên, vì dùng soft delete, bản chất nó là xóa mềm nên record đã xóa nó vẫn nằm tồn đọng trong DB nên dần dần nó làm ảnh hưởng đến hiệu năng, thêm nữa là nếu dùng soft delete thì các câu lệnh join mình phải check whereNull cho field deleted_at của table mình join tới nữa, khá mất công và ảnh hưởng đến hiệu năng. Nên mình muốn tham khảo ý kiến mọi người xem với tình hình hiện tại thì mình có nên giữ soft delete nữa không hay xóa hết trong tất cả các bảng luôn. Mong nhận được suggest từ mọi người, cảm ơn nhiều

thg 6 6, 2018 9:54 SA

Không biết vấn đề hiệu năng mà bạn gặp phải là như nào vậy nhỉ?

Avatar Mango @vinhnguyen
thg 6 6, 2018 11:42 SA
Avatar Van Hung @vhung
thg 6 8, 2018 1:27 SA

@huukimit Mình điều tra trên DB thì có một số bảng hơn 20% là dữ liệu soft delete nên chắc chắn sẽ ảnh hưởng đến performance rồi bạn

Avatar Van Hung @vhung
thg 6 8, 2018 1:28 SA

@vinhnguyen Cảm ơn bạn, link đầu rất hay

2 CÂU TRẢ LỜI


Đã trả lời thg 6 6, 2018 9:36 SA
+2

Theo mình chỉ nên dùng soft delete trong một vài trường hợp

  • Trường hợp đúng nghĩa là xoá tạm, sau đó record có khả năng hồi phục lại nguyên dạng
  • Trường hợp dữ data lại để thực hiện thống kê gì đó, trường hợp này nếu là mình thì mình cũng sẽ migrate các data cần thống kê ra bảng riêng để không ảnh hưởng đến performance của các bảng chính được query nhiều

Nên theo ý kiến cả nhân mình thì việc dùng soft delete cho tất các các tables là một việc không nên làm 😃 Nếu bạn hỏi nên giữ hay không thì mình xin một vote không giữ =))

Chia sẻ
Avatar Van Hung @vhung
thg 6 8, 2018 1:31 SA

Nếu mình bỏ soft delete, khi người dùng xóa thì mình phải trigger event để move toàn bộ dữ liệu sẽ xóa đó sang một audit database để có thể dùng sau này, như rứa thì thao tác xóa xữ lý khá nhiều việc nên khá chậm, bạn có cao kiến gì không bạn

thg 6 8, 2018 2:34 CH

Tức là nhu cầu của bạn là vẫn giữ lại tất cả các data mặc dù người dùng đã xoá để dùng sau này (thống kê hay gì đó mình không rõ) đúng không?

Nếu là thế thì bạn có thể dùng delayed job chẳng hạn. Khi user ra lệnh xoá bạn soft delete như bây giờ đồng thời set một delayed job chạy ngầm, move data đó sang chỗ mới rồi mới hard delete record đó đi. User vẫn được phản ứng lại ngay, bạn vẫn có data để dùng sau này 😃

Đã trả lời thg 7 26, 2018 10:05 SA
0

Vì thiết kế ban đầu vậy rồi nên mình nghĩ bạn cứ giữa nguyên soft delete vậy, vì khi DB của bạn phình lên thì việc delete bằng cách xóa trực tiếp cũng là vấn đề vì xử lý delete chậm hơn, và bạn cũng phải xử lý lại những query liên quan , đồng thời phải test lại, và đánh giá hiệu năng. Cách mình suggest là:

  • Luôn backup DB trước khi delete
  • Tạo batch/cron job để chạy xóa data dưới server (một ngày chạy một lần, 2 lần, tùy vào lượng records cần delete có lớn không)

==> tham khảo thêm ý kiến của bạn @bs90 (Heasygame) ở trên nhé

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí