banner
Jan 22, 2023
194 Views

[Phần 2] Tối ưu MySql query dùng tư tưởng của Data Engineers

Written by
banner

Phần 1: nói về việc làm sao có thể query dữ liệu làm báo cáo với các bảng hàng tỉ records trong vài milli giây bằng …mysql.

Phần 2: Các hạn chế và giải pháp xử lý các hạn chế.

Trong lúc cậu dev mới phục lăn người anh tên Hào thì người anh thả 1 câu kèm điệu cười nhếch mép rất đểu:

Chưa perfect đâu, cái anh hướng dẫn chú chỉ là happy-case. Có mỗi cốc trà đá thì sao anh nhớ được hết những khù khoằm của phương pháp này để dạy chú.

- người anh tên Hào Data Engineers

Cậu dev như bừng tỉnh, ánh sáng chói qua tim liền mời người anh tên Hào đi pay lack, mát gần, bar bốn 1 tuần liền. Người anh sau 1 tuần ăn chơi mệt mỏi sợ bị mời đi nữa nên mới nói cho cậu biết các hạn chế của phương pháp trên:

  1. Chưa tính tới trường hợp không ra dữ liệu nên nếu tác giả nào đó tự dưng bị xóa hết sale thì tổng tiền của tác giả đó không được trả về 0.
  2. Về đường dài procedure của trường hợp của cậu dev sẽ chạy chậm dần do dữ liệu càng ngày càng to khiến việc gom càng ngày càng chậm.
  3. Dữ liệu sẽ bị phình ra lớn.
  4. Khi có thêm trigger -> procedure -> insert vào các bảng OLAP sẽ khiến insert query bị chậm đi khá nhiều.
  5. Lỡ trigger tự dưng bị lỡ 1-2 phát là cũng ảnh hưởng tới tính chính xác của dữ liệu.

Chúng ta sẽ xử lý từng trường hợp như sau:

(1): Sửa procedure dùng RIGHT JOIN như sau

Kết quả test

(2): Chạy procedure gom theo ngày chứ không gom tất cả như procedure trên với các bảng được insert nhiều hàng ngày để đảm bảo dữ liệu được SUM sẽ không phình to chỉ theo chiều hướng tăng.

(3) + (4): Chỉ nên dùng với các dữ liệu dạng số, không nên gom các dữ liệu dạng text vào các bảng OLAP. Ngoài ra phải hiểu câu lệnh để chỉ build OLAP tối ưu với thành phần gây chậm nhất và sau đó join với các bảng dữ liệu khác sau.

Ví dụ như với file code python bên dưới giả lập có 100 đơn hàng được insert tuần tự vào bảng sale thì chạy khi gắn trigger mất hơn gấp đôi thời gian.

Nhưng đổi store procedure và query sẽ được như sau

Khi muốn ra báo cáo thì JOIN với các bảng chứa dữ liệu lớn (TEXT/ VARCHAR/ BLOB...) nhưng không cần thiết index thì vẫn đảm bảo nhanh.

Chạy ra báo cáo cũng chỉ mất 16ms

Thời gian chạy insert 100 records vào bảng Sale giảm chỉ còn hơn 1 nửa (7.7/12.4 = 0.62).

Điều kiệnThời gian insert 1000 records vào bảng saleSo sánh
KHÔNG dùng trigger + store procedure5.4 giây100%
dùng trigger + store procedure12.4 giây230%
dùng trigger + store procedure TỐI ƯU7.7 giây142%

Dung lượng bảng top_revenue_olap lúc này còn 1/4

(5): Chạy câu lệnh gen lại bảng olap hàng đêm.

Cậu dev cảm ơn người anh đẹp trai tên Hào và tiếp tục trả tiền ăn chơi cho người anh 1 tuần tiếp theo. Trong lúc đó văng vẳng lời của người anh:

Khi đã là cao thủ thì cành cây ngọn cỏ cũng có thể thành vũ khí.

- Hào Đẹp Trai
Article Tags:
·
Article Categories:
dev
banner

Leave a Reply

Your email address will not be published. Required fields are marked *