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
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.
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.
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
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
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.
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ỉ
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.
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 @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.
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?
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 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.
À. 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