Xin tư vấn lọc kết quả 10M rows Mysql

Discussion in 'Hỏi Đáp Kỹ Thuật' started by Cải Lão Ngoan Đồng, Jul 14, 2020.

  1. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Các bác có giải pháp filter ra top bài post có lượng views cao nhất trong 1 khoảng thời gian tuỳ thích không ạ. Dữ liệu cỡ 10M row mysql. Mong ae tư vấn cho giải pháp đảm bảo được tốc độ lẫn chi phí server. Thank ae
     
  2. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    Cho các cột trong mysql với data demo luôn thớt, cho dễ ae tư vấn
     
  3. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Mình dùng elasticsearch. Thấy rất ổn.
     
    Cải Lão Ngoan Đồng and Nam like this.
  4. Nai

    Nai MiddleMan Staff Member

    Chưa filter kiểu này bao giờ vì phải cập nhật vào data mỗi khi có request.
    Nhưng nếu làm mình sẽ làm thế này:
    - Đánh index 1 cột năm + 1 cột tháng + 1 cột ngày + 1 cột thời gian
    - 1 cột cập nhật views
     
  5. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Em định Table sẽ thế này:
    Posts
    -id, title, total_views
    Stats
    -id, post_id, daily_view, date

    Ý tưởng của em là hàng ngày sẽ quét toàn bộ 100k post để tạo mới 100k row trong cái bảng Stats (post_id kèm với daily_view), đồng thời đẩy index này qua ES.
    Việc tìm kiếm với keyword kèm sắp xếp theo lượt view trong 1 khoảng thời gian (tối đa 1 tháng) là của ES xử lý.

    Em chưa làm bao giờ, đây là những gì e suy nghĩ và tìm kiếm suốt 1 tuần qua. Rất mong anh em có kinh nghiệm chỉ giúp!
     
  6. Dang

    Dang Bang Chúng

    Theo ý kiến cá nhân thì :
    1. Thống kê theo request (1 user dùng trình duyệt - thực thi được js => thì mới thống kê như đoạn bên dưới. Chứ ngày nào cũng loop và log all thì tốn tài nguyên quá!
    HTML:
    <script type="text/javascript">setTimeout(function(){new Image().src='https://domain.nam/path/to/statistic.gif?param1=1&param2=2&ex'},5E2)</script>
    2. Tìm hiểu thêm api Google Analytics => đỡ hao resource.
    3. Embed mã Google Analytics coi theo ngày đơn giản, nhẹ đầu :D
     
  7. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Mình làm để cho user nó lọc kết quả bạn à
     
  8. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Cách này mình thấy hay đấy. Nhưng thay vì quét toàn bộ 100k post thì bạn hãy để cron hoặc dùng screen (while) chạy định kỳ để đẩy qua ES.
     
  9. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Để đẩy 100k post qua ES thì tốn nhiều thời gian không anh. Thank a
     
  10. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Mình ví dụ thế này nhé.
    1. Ở table post nhé. Mình sẽ thêm cột creat_at và update_at. Đồng thời đánh index. Khi nào cập nhật views thì đồng thời cập nhật update_at.

    Nếu cần nhanh hơn thì lúc đầu đẩy hết qua ES, sau này chỉ đẩy những id được cập nhật update_at. Mình thì ngày hôm sau mới cập nhật các id thay đổi. Chậm hơn 1 ngày.
    2. Ở table Stats, lúc đầu đẩy hết qua ES, Sau đó thì ngày hôm sau chỉ thêm id của ngày hôm trước, dựa theo cái cột date đó. Dữ liệu sẽ chậm hơn 1 ngày.

    Note: Cần dữ liệu reatime thì khi nào cập nhật cái gì thì đẩy qua ES cập nhật luôn.

    P/s: Đẩy 100k post qua ES, em tính đơn giản 1s/1post, cần hơn 1 ngày. Nếu đẩy số lượng lớn 1s/100post thì nhanh hơn. Tuỳ e nhé.
     
  11. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Cụ thể quá anh! Nhưng phần Stats phải là tạo mới chứ không phải là update ạ. Dữ liệu giống như kiểu làm biểu đồ thống kê views từng ngày của Post đó anh
     
    xmenvn2510 likes this.
  12. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    ok, phần stats là thêm mới. Tại a đang code dở dang nên ko chú ý. A sửa rồi nhá.​
     
  13. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

  14. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Check skype a ơi
     
  15. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    ok
     
  16. money

    money Hương Chủ

    Đang diễn hay thì 2 anh em đóng cửa kéo rèm chơi riêng là sao nhỉ?
    Riêng cái cấu trúc table Stats nhiêu đó fileds là không đủ. Nên có thêm thông tin như: referer là gì, search engine gì, IP nào, ngày, giờ, ... Bởi vì đã thống kê thì thống kê cho tới, người xem mới sướng. Data cũng không quá to. Giả sử 1 ngày em có 200K visitors --> thêm 200K records/ngày --> tháng 6M records --> 1 năm mới có 72M records --> không nhằm nhò gì với khả năng của ES.
    Việc import từ MySQL (hay DB nào đó) sang ES rất nhanh, 1s import 1 vài K records là bình thường. Thậm chí thay vì insert vào table Stats trên mySQL rồi lại phải import sang ES thì em có thể insert trực tiếp vào ES vẫn vô cùng nhanh.
     
  17. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Mấy cột a thêm ko cần đâu. Vì cái web này thống kê cho user xem, nó ko phải dạng site public ( chủ thớt skype nói vậy). Nên ko có các thông số đó.

    Quả insert trực tiếp vào ES e thấy hay đấy.
     
  18. money

    money Hương Chủ

    Là user nó sẽ cần thêm đó em. Ví dụ cho nó xem theo ngày rồi, giờ nó thích theo giờ thì làm sao? Ko lẽ lúc đó lại đập đi làm lại. Nên db thì cứ thiết kế max volumn luôn, còn thực tế dùng bao nhiêu thì mình code bấy nhiêu, còn lại từ từ upgrade chức năng mới.
     
  19. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Ok anh.
     
  20. Cải Lão Ngoan Đồng

    Cải Lão Ngoan Đồng Tân Thủ Thôn

    Đỉnh quá anh!
    Nếu đẩy luôn sang Es thì có cần insert bên mysql nữa ko a nhỉ? Và bên Es thì đẩy toàn bộ field sang được ko anh, e nghĩ nếu đẩy toàn bộ thì khi lấy ra dữ liệu đỡ phải query ngược lại mysql. Mong được a trợ giúp