Giới hạn mysql

bổ sung kiến ​​thức cho học viên học lập trình php tại Đào Tạo Tin Học KEY, chúng tôi chia sẻ cho các bạn cách Hướng dẫn sử dụng có, giới hạn, nhóm theo, sắp xếp theo thứ tự trong cơ sở dữ liệu MySQL khi học lập trình

=> Trong quá trình học trực tuyến, các bạn có những khó khăn hay thắc mắc gì các bạn có thể để lại lời nhắn bên dưới khung Đăng nhận xét - Bình luận để Đào Tạo Tin Học KEY có thể hỗ trợ các bạn một cách chu đáo

Nếu muốn có cái nhìn tổng quan hơn về thiết kế web hoặc muốn làm được giao diện một trang web trong khoàng thời gian ngắn mà chất lượng luôn đảm bảo, hiện đại,. các bạn có thể tham khảo thêm thông tin tại. https. //Chìa khóa. com. vn/lap-trinh-6/thong-bao-chieu-sinh-lop-lap-trinh-web-1060/

Bạn có một trang web với danh sách rất nhiều bài viết, hoặc blog, hoặc một số đối tượng khác và nó quá dài để hiển thị trên một trang duy nhất. Vì vậy, bạn quyết định chia nó thành nhiều phần, ví dụ như 10 mục trên mỗi trang và hiển thị một nút Next để đi tới trang tiếp theo

dựa vào số trang hiện tại, bạn sẽ truyền các tham số phù hợp cho OFFSET và GIỚI HẠN để lấy ra những dữ liệu phù hợp

SELECT * FROM users WHERE <messy_filtering> ORDER BY created_at DESC OFFSET $M LIMIT $N

Vấn đề

Mọi thứ như nhẹ nhàng như lông hồng, cho đến khi bạn có 50. 000 bản ghi trong bảng, và có người dùng nào "rảnh" cố gắng đi hết 5000 trang (VD như bác Google)

Vấn đề là gì? . Khi người dùng nhấp vào trang thứ 5000, truy vấn của bạn sẽ có dạng SELECT .. OFFSET 49990 LIMIT 10. Bạn sẽ có chút buồn khi biết răng lúc đấy MySQL sẽ phải tìm tất cả 50. 000 bản phù hợp, bỏ 49. 990 bản ghi đầu tiên và trả lại 10 bản ghi cuối cùng cho bạn

Tìm tất cả các bản ghi trong bảng chi để lấy các bản ghi cuối cùng ở những trang cuối cùng, nó có thể tốt cho nhiều máy chủ I/O gây ra lỗi hết thời gian chờ hoặc có thể ảnh hưởng đến các hoạt động khác và quan trọng hơn là

A number of other problems

Hiệu suất là vấn đề chính, ngoài ra nó còn một số vấn đề khác

  • Khi người dùng đang trải nghiệm web chuyển thì trang này sang trang khác, lúc đó có một bản ghi mới được thêm vào, người dùng có thể sẽ bỏ lỡ một bản ghi hoặc có một bản ghi bị lặp lại ở trang sau
  • Nội dung thường tăng và thay đổi liên tục. Mệnh đề
    #First page (latest 10 items):
        SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
    #Next page (second 10):
        SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
    
    0 và
    #First page (latest 10 items):
        SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
    #Next page (second 10):
        SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
    
    1 thậm chí có thể làm cho MySQL cố gắng tìm tất cả các bản ghi phù hợp rồi chỉ lấy 10 bản ghi đầu tiên cho trang 1 trong kết quả

Chúng ta phải làm gì?

Nâng cấp máy chủ? . Dữ liệu sẽ tiếp tục tăng lên và sẽ đến lúc máy chủ nâng cấp không giải quyết được vấn đề đó

Đánh giá INDEX liệu có tốt hơn không?

Build lại từ đầu để tìm cách tối ưu hóa bản gốc?

Vì vậy phải làm sao? . Bạn đang tìm lý do tại sao bạn phải sử dụng

#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
2 và tìm cách giải quyết vấn đề đó mà không cần
#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
2 nữa

Phải làm gì?

Phần cứng? . Dữ liệu sẽ tiếp tục phát triển và ngay cả phần cứng mới nhất cũng sẽ không xử lý nó

CHỈ SỐ tốt hơn? . Bạn phải tránh xa việc đọc toàn bộ bảng để truy xuất trang thứ 5000

Xây dựng một bảng khác nói rằng các trang bắt đầu từ đâu? . Đó sẽ là một cơn ác mộng duy trì, và trả tiền

dòng dưới cùng. Không sử dụng OFFSET;

#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10

Với INDEX (id), điều này trở nên rất hiệu quả

Áp dụng - bỏ OFFSET

Hiện tại, nút Next có thể có URL giống như thế này.

#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
6 Và câu truy vấn sẽ như thế này

________số 8_______

Bây giờ, nút Next sẽ có URL giống như thế này.

#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
8 (Lưu ý rằng
#First page (latest 10 items):
    SELECT .. WHERE .. ORDER BY id DESC LIMIT 10
#Next page (second 10):
    SELECT .. WHERE .. AND id < $left_off ORDER BY id DESC LIMIT 10
9 không thể tính từ
SELECT * FROM posts WHERE category=1 ORDER BY id DESC OFFSET 49990 LIMIT 10
0). Bằng cách đánh INDEX (danh mục, id), bạn sẽ thấy nó có hiệu quả thế này