Yêu cầu thg 5 30, 2018 7:13 CH 2149 0 3
  • 2149 0 3
+2

Nên lưu trữ dữ liệu thế nào nếu có tới hàng tỷ record?

Chia sẻ
  • 2149 0 3

Mọi người có ai có kinh nghiệm làm việc với database cỡ lớn chưa cho mình hỏi chút kinh nghiệm về cách tổ chức, lưu trữ dữ liệu thế nào để đảm bảo hiệu năng? Giả sử như mình có 1 database lưu trữ bằng MySQL với bảng có hơn 1 tỷ dòng.

3 CÂU TRẢ LỜI


Đã trả lời thg 5 31, 2018 4:27 CH
+3

Đây là ý kiến cá nhân của mình theo 1 chiều nếu có gì không được mong các bạn góp ý. Mình sẽ cố gắng tìm hiểu và sửa chữa.


Mình đang không hiểu câu hỏi của bạn là:

1, Sử dụng loại hình CSDL (NoSql, RDBMs,..) nào cho vấn đề sử dụng những dữ liệu lớn lên đến > 1 tỷ bản ghi trong 1 bảng

hay là

Những giải pháp, biện pháp nào tổ chức dữ liệu ra sao khi làm việc với những db khủng.

Câu trả lời của mình về vấn đề này là như sau (bạn tùy ý tham khảo nhé 😄):

1, Việc bạn sử dụng dữ liệu kiểu NoSql hay RDBMs nó có ý nghĩa quyết định rất lớn đến hiệu suất kết quả của người dùng lớn đơn giản bởi NoSQL sinh ra để làm việc với những dữ liệu lớn, đa dạng và dễ dàng mở rộng dành cho lập trình viên. Nhưng trong những bài toán phức tạp và yêu cầu về rằng buộc lớn thì RDBMs luôn là xu thế được ưu tiên hàng đầu. Nếu ai bảo dùng RDBMs chậm thì bạn cứ thẳng thắn nói rằng trước năm 2009 khi NoSQL bùng nổ thì tốc độ lướt web của họ có chậm hơn so với bây giờ là bao không ?. Và tại sao ngân hàng vẫn chơi Java + oracle để dùng sao không dùng NoSQL để việc rút tiền nhanh thêm đi =)). Thực chất trước mình có tìm hiểu và biết rằng rất nhiều công ty lớn nó sử dụng song song 2 thằng này theo thứ tự: NoSQL làm việc với các client user, còn RDBMs thì là nơi backup dữ liệu. Việc sử dụng qua lại 2 thằng đảm bảo cho hệ thống vừa nhanh như gió và rằng buộc chắc chắn. Nhưng nếu chương trình của bạn là chuyên biệt và có tính năng quan trọng thì nên sử dụng RDBMs.


2, Việc bạn sử dụng loại dữ liệu nào cho những bài toán như này chỉ là một phần, Việc bạn thiết kế kiến trúc dữ liệu ra sao lại là 1 phần rất quan trọng. Ví dụ như này nhé:

Ta có cổ phiếu BUG giao dịch 1s sẽ cập nhật 1 lần vậy trong 1 ngày làm việc 8h ta có : *8 * 60 60 = 28.800 (record)

Bạn phải thực hiện tạo biểu đồ cho cổ phiếu đó theo thời gian biết rằng trong 1 record có trường date_time_update (datetime). Và có hàm getTime() (run -> 0.01ms)

vậy bây giờ bạn sẽ mất 28.800 * 0.01 = 288 ms = 0.288s để vẽ biểu đồ cho 1 cổ phiếu. Nếu có 100cp thì 0.288 s * 100 = 28.8s

Nhưng nếu thiết kế DB tốt hơn thì bạn sẽ thêm 1 trường time_update chính là thời gian của date_time_update và khi đó bạn sẽ tiết kiện được 28.8s thực thi tuy nhiên việc này sẽ đánh đối bằng dung lượng lưu trữ. Nếu time_update = 2byte / 1 record => 2880000 * 2byte = 5760000 byte = 5.76 MB.


Đây là 1 cách mình thường xuyên sử dụng với việc đánh đổi bộ nhớ lưu trữ lấy tốc độ của hệ thống. Ngoài ra trong khi code bạn sử dụng việc thao tác dữ liệu cho từng trường hợp sẽ nhanh hơn việc thao tác dữ liệu để dùng chung cho mọi trường hợp. Còn 1 vài trick mà mình đã sử dụng và tìm hiểu cũng hiệu quả lắm:

  • Phân vùng những dữ liệu theo dạng Cũ - Mới, Thời gian, Địa lý, các thuộc tính đặc trưng,.... sử dụng where sẽ không làm cho tốc độ của bạn nhanh hơn thay vì thế hãy sử dụng bảng tạm để phân vùng dữ liệu (Tham khảo: https://www.red-gate.com/simple-talk/sql/database-administration/gail-shaws-sql-server-howlers/)

  • Xóa dữ liệu cũ định kỳ: Dữ liệu cũ sẽ không thực sự bị xóa đi mà nó chỉ chuyển từ bảng A sang bản AHistory,..

  • Thực hiệu lưu file nhị phân các hình ảnh tệp tin thay vì nhị phân chúng và lưu vào CSDL,....

Đó là 1 số cách mình đã từng và hay sử dụng ngoài ra nếu bạn muốn hiểu thêm có thể đọc 2 bài viết sau.

https://dba.stackexchange.com/questions/188667/best-database-and-table-design-for-billions-of-rows-of-data/188668

https://dba.stackexchange.com/questions/20335/can-mysql-reasonably-perform-queries-on-billions-of-rows

Chia sẻ
Avatar Lão Còi @laocoi
thg 6 1, 2018 2:21 SA

@tuanbacyen Ý mình là "Những giải pháp, biện pháp nào tổ chức dữ liệu ra sao khi làm việc với những db khủng." đó bạn. Cảm ơn chia sẻ rất hữu ích của bạn nhé.

Đã trả lời thg 5 31, 2018 2:29 SA
+2

Dữ liệu lên tới hàng tỷ dòng thì mình nghĩ nên chuyển sang dùng NoSQL 😃

Chia sẻ
Đã trả lời thg 6 1, 2018 1:01 SA
0

NoSQL thôi.

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí