Tình huống thực tế

Mở đầu bằng một tình huống thực tế như sau, để chúng ta cùng phân tích:

“Bạn đang lướt Facebook, say sưa trong thế giới của những bài đăng bất tận. Bỗng nhiên, mọi thứ chậm lại, trang bắt đầu load ì ạch, đặc biệt khi bạn vào những group có hàng triệu thành viên. 😩😩😩 Bạn có bao giờ tự hỏi, điều gì đang xảy ra đằng sau đó không? Bây giờ bạn là một lập trình viên đang xây dựng tính năng hiển thị danh sách bài viết tương tự như News Feed của Facebook. Bạn sử dụng MySQL và dùng câu lệnh LIMIT để phân trang. Vậy thì làm thế nào nếu có tình huống như vậy?”

Nguyên tắc phân trang trong MySQL

Chúng ta đều đồng ý rằng, trong MySQL dữ liệu càng nhiều thì query càng chậm. Thực tế như sau, khi sử dụng limit X,Y để truy vấn, giá trị X càng lớn thì tốc độ truy vấn càng chậm. Để tôi lấy một ví dụ trong video mà chúng ta đã giải quyết với 20 triệu records như sau:

Ví dụ: Chúng ta có hai câu truy vấn với các giá trị X, Y khác nhau.

  • limit 0,10: Thời gian truy vấn khoảng 20 mili giây.
  • limit 1000000,10: Thời gian truy vấn có thể lên đến 8 giây hoặc lâu hơn thế.

Xem video có thể thấy rằng, nếu X càng lớn thì timeResponse càng cao. Đây chính là câu hỏi mà chúng ta phải khám phá, và có bao nhiêu cách để cải thiện vấn đề đó.

Hình ảnh này chưa có thuộc tính alt; tên tệp của nó là partition.mysql_fl3amn.png

Hay nói cách khác thì, tôi sẽ đưa ra hai câu lệnh LIMIT và vấn đề:

“Giả sử bạn có bảng posts với hàng triệu bản ghi. Bạn viết hai câu truy vấn sau để lấy ra 10 bài viết:”

-- Câu lệnh 1: Lấy 10 bài viết đầu tiên
SELECT * FROM posts ORDER BY created_at DESC LIMIT 0, 10;

-- Câu lệnh 2: Lấy 10 bài viết bắt đầu từ bản ghi thứ 1,000,000
SELECT * FROM posts ORDER BY created_at DESC LIMIT 1000000, 10;


“Thoạt nhìn, hai câu lệnh có vẻ tương tự. Nhưng khi thực thi, bạn nhận ra một sự khác biệt lớn: Câu lệnh 1 chạy rất nhanh, trong khi câu lệnh 2 lại chậm một cách đáng kể. 🤯🤯🤯 Tại sao lại có sự chênh lệch này?

Hãy cùng lắng nghe cuộc đối thoại giữa hai lập trình viên: một Junior (chưa có kinh nghiệm) và một Senior (đã có kinh nghiệm) để hiểu rõ…”

Test: insert dữ liệu 20 triệu records nhanh trong mysql

Bây giờ, tôi thử insert dữ liệu với cách mà tôi thường triển khai, nó rất nhanh mà thôi. sau đó tôi sẽ lần lượt thay đổi giá trị của X và chúng ta cùng xem… Và sau đó hãy xem các trường hợp xảy ra và cách giải quyết chúng như thế nào?

Chuyên mục: Sharing

0 Bình luận

Để lại một bình luận

Avatar placeholder

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *