Yêu cầu thg 4 10, 2021 3:05 SA 209 0 6
  • 209 0 6
+1

Cách xử lý thông minh nhât cho truy vấn

Chia sẻ
  • 209 0 6

Chào mọi người, mình có 1 bảng trong database Cứ sau 1 ngày mình có 1 con cronjob chạy lúc 3h sáng. chuyển điểm từ cột A sang cột B. Hiện tại code đang là như này:

   $a = KhachHang::where('ID',$ID)->first();
   $sodiem = $a->cot_a; 
    $a->decrement('cot_a',$sodiem);  // - trừ 
	$a->increment('cot_b',$sodiem); //  + cộng

Vấn đề hoàn toàn bình thường, nhưng dữ liệu của mình tầm khoảng 1 triệu bản ghi nên khi thực hiện khá lâu. Vậy cho mình hỏi có cách nào để xử lý vấn đề này tốt nhất? Thanks

6 CÂU TRẢ LỜI


Đã trả lời thg 4 10, 2021 3:46 SA
Đã được chấp nhận
+2

Bạn có thể chia nhỏ dữ liệu của bạn ra thành nhiều tập bản ghi có kích thước nhất định. Bạn có thể sử dụng chunk và kết hợp với queue để xử lý

Chia sẻ
Avatar TinhTN @tinhtn89
thg 4 20, 2021 9:33 SA

Cảm ơn ý kiến mọi người, sau một hồi thảm khảo mình nghĩ chỉ có cách này giải quyết tạm ổn vấn đề. Thank you so much.

Đã trả lời thg 4 12, 2021 1:53 SA
0

dùng paginate của laravel để phân trang các id của khách hàng: DB::table('KhachHang')->paginate(200) // [ 1, 2,...., 200]

sau đó duyệt mảng vừa lấy ra được chay query thuần: update khach_hang set cot_at = cot_a + so_diem, set cot_b = cot_b - so_diem where ID in (1,2,3,4,5....,200)

Chia sẻ
Avatar TinhTN @tinhtn89
thg 4 12, 2021 2:42 SA

Tại sao phải chạy querry thuần ?

thg 4 12, 2021 7:52 SA

@tinhtn89 không thì bạn viết code bằng laravel cũng được, nhưng khi thực thi thì câu query phải có dạng như vậy.

Đã trả lời thg 4 12, 2021 4:12 SA
0

Không hiểu câu hỏi lắm là update cho 1 record hay nhiều record

Chậm do đâu, do chạy từng query với mỗi id trong loop hay do chưa có index ?

Nếu là truy vấn trong loop thì chuyển thành 1 câu bulk update thôi.

Chia sẻ
Avatar TinhTN @tinhtn89
thg 4 12, 2021 5:08 SA

Chậm là do nó phải xử lí nhiều record ( tầm gần 1 triệu)

thg 4 12, 2021 5:45 SA

@tinhtn89 vậy là update từng record trong tập 1 triệu record đó ? Thế thì lưu id thành array rồi khi đủ tầm 10k-100k id thì chạy update where in.

Avatar TinhTN @tinhtn89
thg 4 12, 2021 6:33 SA

ừ, cách đó thì m biết, đang tham mưu xem có cách gì ngon hơn không ấy.

thg 4 13, 2021 3:50 SA
Đã trả lời thg 4 16, 2021 4:26 SA
0

nếu cấu trúc dạng update như kia, bạn có thể thử cách sau:

update bảng KhachHang và set cot_a = 0 (decrement đi $sodiem thì cũng là trừ đi chính cái cot_a đó thì luôn = 0) cot_b = cot_b + cot_a Where: cái này thì như câu lệnh trên đã có sẵn id, nếu ko muốn chạy dạng loop thì where in hay gì đó mà bạn có.

Performance thì mình cug ko chắc là nhanh hay chậm, chỉ là 1 cách có thể tham khảo thêm,

Chia sẻ
Avatar Phạm Thảo @cr_ronaldo16396
thg 4 16, 2021 4:30 SA
Đã trả lời thg 4 16, 2021 4:31 SA
0

Update muốn nhanh thì chắc có select bản ghi ra insert vào bảng mới, dùng join để update data giữa bảng mới và bảng cũ.

Chia sẻ
Avatar Nguyen Nhu Thuy @nguyen_nhu_thuy
thg 4 16, 2021 6:31 SA
Đã trả lời thg 4 16, 2021 6:32 SA
0

Bạn thử chạy 2 câu query kiểu này xem đc không

UPDATE KhachHang SET cot_b = cot_b + cot_a WHERE ID IN (id1,id2,...)

UPDATE KhachHang SET cot_a = 0 WHERE ID IN (id1,id2,...)

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í