[Help] Cấu hình MySQL xử lý >= 50M records

Discussion in 'Thảo Luận Chung' started by command, Mar 2, 2019.

  1. Kiến Lửa

    Kiến Lửa Tân Thủ Thôn

    Thì vẫn theo cách trên thôi bác. Không dùng COUNT và OFFSET

    Table product có pro_id(KEY).
    Table cate có cat_id(KEY).
    Table pro_cat có (pro_id,cat_id) cặp KEY và colmun pro_num tăng dần theo cate.
    Data table pro_cat :
    cate_id = 1, pro_id = 1, pro_num = 1
    cate_id = 1, pro_id = 2, pro_num = 2
    cate_id = 1, pro_id = 3, pro_num = 3
    cate_id = 2, pro_id = 1, pro_num = 1
    cate_id = 2, pro_id = 5, pro_num = 2
    cate_id = 2, pro_id = 6, pro_num = 3
    ------------------------------------------------------------------
    SELECT * FROM pro_cat WHERE cate_id = 1 AND pro_num > 0 AND pro_num < 3
     
  2. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    ko biết data của mình bao giờ đến 50m row đây.
     
  3. Nai

    Nai MiddleMan Staff Member

    Làm vậy ko được đâu cụ, vì cat_pro 1 cat_id có thể kết nối với nhiều pro_id
    Còn id primary key của cat_pro table thì ko thể nắm được nó liên tục từ bao nhiêu tới bao nhiêu để mà query được.
    upload_2019-6-19_7-58-22.png
     
  4. money

    money Hương Chủ

    @Nai vps cấu hình như nào em?
     
  5. Nai

    Nai MiddleMan Staff Member

    Hiện tại 4vCPUs, 8GB RAM và 160GB SSD của DO anh
     
  6. money

    money Hương Chủ

    Vậy tăng cấu hình Mysql lên thử xem. Trong bài đầu tiên thớt có hướng dẫn (nếu em xài inno). Còn xài myisam để lát anh ngồi laptop anh send cho.
     
    Nai likes this.
  7. Nai

    Nai MiddleMan Staff Member

    Table đó em dùng Inno anh ơi.
    Post đầu tiên của thớt thì không phù hợp với query của em.
    Còn dùng explain thì ra kết quả ko có đúng: Em count query theo cat_id ra có 900k mà bỏ explain vào ra tới 1,5 triệu rows.
    Dùng information_schema.INNODB_SYS_TABLESTATS.NUM_ROWS thì không nhét query theo cat_id được và số rows tổng cũng ko đúng. như count
     
  8. money

    money Hương Chủ

    Query của em là:
    select pro_id from pro_cat where cat_id = xxx limit X, Y
    Câu lệnh này sẽ càng chậm khi:
    - số pro_id của cat_id = xxx khá nhiều, và
    - offset X tăng lớn lên

    Giải pháp:
    - chỉnh cấu hình (chứ ko phải code - nên đâu có gì mà ko phù hợp? ) như post đầu để tăng ram và cpu cho mysql
    - tìm cách code khác để tối ưu
     
    Nai likes this.
  9. Nai

    Nai MiddleMan Staff Member

    Em chỉnh như thớt luôn rồi mà cũng ko nhanh đáng kể mấy. offset X lớn càng max thì nhanh cũng 10s :(
     
  10. money

    money Hương Chủ

    kkk chuyển sang ES đi em, bao nhanh. DB truyền thống làm bigdata mà muốn nhanh thì phải cấu hình server khủng và kỹ năng DBA phải giỏi mới tối ưu nổi. 1 con VPS còi không ăn thua đâu.
     
    Vito_King and Nai like this.
  11. Dung Vuong

    Dung Vuong Sơ Nhập Giang Hồ

    A @money cho e hỏi là cái ES e thấy căn bản là nó vẫn query trong db ra mà anh. Mà sao nó max nhanh được anh nhỉ. Thông não e phát
    E mới chỉ coi qua thôi chứ chưa làm thật. Theo như e hiểu là nó query trong db xong cho ra 1 cái dạng dữ liệu. Rồi từ dạng này mình mới móc data ra. Như vậy nó vẫn chậm do query lâu mà nhỉ
     
  12. sincos

    sincos Bang Chúng

    Tôi cũng như cậu chưa có cơ hội dùng. Nhưng hình như nó có công nghệ index mạnh nên móc data ra nhanh, còn database (ví dụ mysql) chỉ là chỗ chứa dữ liệu mà thôi.
     
  13. console

    console Bang Chúng

    ES nó kiểu 1 web server chạy riêng lẻ, DB được reindex rồi đẩy len ES server đó. Xong rồi thì k có query trong DB đó nữa mà được ES server giải quyết nên là nhanh hơn đó bác.
     
    Dung Vuong likes this.
  14. sincos

    sincos Bang Chúng

    Vậy là mình cứ insert trên mysql rồi khi query thì lấy từ ES hả?
     
  15. money

    money Hương Chủ

    @Dung Vuong @sincos ES nhanh vì cơ chế index của nó phải nói là xuất sắc. So với cơ chế index của ES thì index của các DBMS khác chỉ là con nít.

    Dùng ES thì đại khái là: vẫn phải có 1 db mysql —> import định kỳ vào ES —> query lấy data trên ES và show ra.

    Có thể insert thẳng vào ES nhưng nó khuyến cáo ko nên dùng như thế và cũng ko nên xem ES là nơi lưu trữ data chính.

    Thiệt hại khi dùng ES là dung lượng lưu data tăng khoảng 5 lần (theo cấu hình của anh thôi, có thể tăng hay giảm tuỳ theo mỗi người index nhiều hay ít)

    Lợi ích thì siêu nhanh, search phrase bất kỳ với db cỡ 100M rows trong nháy mắt.
     
    Vito_King, Nai and console like this.
  16. Nai

    Nai MiddleMan Staff Member

    Là kiểu index của nó cũng giống sphinx ấy hở anh. Whery lấy id ra rồi dựa vào id đó móc trong database ra?
     
  17. money

    money Hương Chủ

    Index của ES hoành tráng hơn sphinx nhiều và nhiều thứ phức tạp hơn, ví dụ như đa ngôn ngữ hay đánh trọng số các results nào match nhất với keyword. Anh chưa tìm hiểu hết, chỉ tìm những cái anh cần làm cho autoweb với bigdata thôi chứ nói sâu nữa chưa đủ trình.

    ES quẻry là lấy ra data luôn chứ ko phải chỉ có id. Vì khi import từ mysql vào ES mình có quyền chọn các fields cần import và tạo index. Đương nhiên nếu em muốn làm như sphinx vẫn ok.

    Anh nói nó ko khuyến khích dùng ES làm nơi chứa data chính chủ yếu là do tính toàn vẹn dữ liệu của ES ko cao như các DBMS truyền thống nên phải cẩn thận với các dữ liệu quan trọng như: dữ liệu doanh nghiệp, kế toán tài chính, ... chứ còn autoweb như mình thì anh vẫn store hết data vào ES. Tuy nhiên anh vẫn import vào mysql trước vì cái tool crawl data của anh support mysql :D Mất thêm 1 bước import từ mysql vào ES nhưng cũng nhanh lắm, 10M rows import khoảng 20 phút thôi.
     
    Nai likes this.
  18. console

    console Bang Chúng

    Đem database 50MB của em qua ES đi, bao nhanh. Mysql chịu k nỗi đâu, tốn tiền zô CPU vs Ram nữa chừ
     
    Nai likes this.
  19. Dung Vuong

    Dung Vuong Sơ Nhập Giang Hồ

    À. Vậy là lưu trên ES và query trên ES luôn ạ. Sau đó nó trả data về dạng json đúng k anh. Vậy để e mò thêm xem sao. Mà e không hiểu tại sao dung lượng lưu data nó lại tăng anh. Tăng là tăng trên server của mình à anh. Hay tăng trên ES anh
     
  20. sincos

    sincos Bang Chúng

    @money nó không realtime data từ mysql sao anh. Mỗi lần cứ phải import hả?