Lời nói đầu
- Chắc hẳn ai cũng từng làm dự án gặp bài toán khó , bài toán khó của tôi hiện tại là làm sao xoá được dữ liệu trong 1 bảng dữ liệu bao gồm 1.5 tỉ row và không có bất kỳ index hay transaction nào hết ?
Nguyên nhân và cách khắc phục
Nguyên nhân
- Do từ đầu khi tạo bảng không có nghĩ các trường hợp cũng như đánh giá nghĩ đơn thuần chỉ tạo ra 1 bảng lưu lịch sử giao dịch nên team vận hành cùng với team IT soft ware không có đánh giá sâu chi tiết dẫn đến dữ liệu nạp này càng nhiều các bạn tưởng tượng như lúc xây 1 toà nhà mà không thiết kế chắc cái móng nhà ấy như vậy là dữ liệu cứ insert into , insert theo bath ... dẫn đến cao tải cùng với disk của server cao lên .và có thực hiện bất kỳ câu lệnh nào cũng rất rất chậm cao tải ...
Cách khắc phục tạm thời.
- Sau khi một ngày một bạn bên bộ phận vận hành có kiểm tra hệ thống và có xác định được rằng table này có dữ liệu cực lớn và cần tối ưu làm rõ nguyên nhân ở đâu .
- Sau khi nhận được thông tin như vậy yêu cầu chặt chẽ phía bộ phận IT + bộ phận vận hành bảo trì hệ thống (DBA) vào kiểm tra .
- Bộ phận bào trì vận hành chỉ ra vấn đề rằng bảng này có lượng request thay đổi hằng ngày cực cao và cần phải được stop lại không lưu bảng này nữa tìm cách khắc phục
- Họp gấp bộ phận phát triển (Dev + DBA) DBA đưa ra phương án rằng tạo 1 bảng mới backup tạm thời rằng ví dụ (backup_1) tương tự các trường đầy đủ như bảng đang sử dụng và vận dụng thuật toán partion range theo tháng và index đầy đủ .
- Bộ phận phát triển chỉnh sửa code gấn call insert vào bảng do bộ phận DBA tạo ra . (Vì bảng kia đã quá tải không thể insert thêm và tạm dừng việc select + insert + update với bảng có 1.5 tỉ rows) => Như vậy tạm thời vấn đề đã được giải quyết ở phía chuyên gia đã thành công giải quyết đc vấn đề trước mắt rằng là tạo cấu trúc chuẩn không thực hiện kết nối đến bảng dữ liệu có 1,5 tỉ rows
Cách khắc phục lâu dài
- Như vậy ở bước trên chúng tôi đã giải quyết đc vấn đề cao tải và tối ưu mặt dữ liệu không bị mất (vì các công ty công nghệ dữ liệu là kim cương liên quan sống còn của doanh nghiệp như momo vừa rồi bị lỗi cái là cũng toang)
- Tiếp đến bây giờ làm sao giải quyết được vấn đề băm dữ liệu 1.5 tỉ row kia ra và sao cho hợp lý vì nếu giờ cứ select * from where create_time > 30 để insert vào bảng mới tạo cũng không hợp lý
- Qua thảo luận lý do nguyên nhân vì chưa đánh index và partion (như vậy chỉ có cách là limit lại dữ liệu và dựa vào trường id ) và để đảm bảo được dữ liệu toàn vẹn thì lại phải tạo ra bảng mới nữa để move dữ liẹu từ bảng cũ 1.5 tỉ rows sang Các bước chúng tôi tiến hành như sau .
- Tạo ra bảng backup1 cũng đầy đủ partion + index .
- Sau đó chúng tôi sẽ insert theo lô (ví dụ từ 0 -> 10000) và tiếp theo là 10000-> 200000 như vậy chúng tôi sẽ giới hạn được câu lệnh select và scan toàn bộ data
- Sau đó chúng tôi viết tool foreach bước 2 này insert bath vào bảng backup1
- Bước 3 là chờ đợi nó chạy xong thôi .
Kinh nghiệm và bài học rút ra .
- Chúng ta phải nghĩ hết các trường hơpj cần giải quyết vấn đề tốt nhất
- Sau đó phải hiểu kiến trúc hệ thống + thuật toán của database mình đã từng gặp trường hợp cứ chậm và chậm mãi thôi ở đây sinh viên mới ra trường sẽ không có kinh nghiệm -THường cần hiểu thật sâu rằng từng câu lệnh và chiến lược thực thi của database nữa . vòng đời dữ liệu những case chúng ta có thể gặp
- ở bài viết này mình chia sẻ kiến thức ở phần quy trình nhiều hơn các bạn dựa vào quy trình này gặp trường hợp các bạn giải quyết tốt nhất
- CHÚC CÁC BẠN SỨC KHOẺ THÀNH CÔNG