2008-11-27 33 views
10

Tôi đang xem xét việc xây dựng ứng dụng Rails sẽ có một số bảng lớn với số lượng lên đến 500 triệu hàng. Để giữ cho mọi thứ trở nên linh hoạt Tôi hiện đang xem xét cách một bảng lớn có thể được chia thành nhiều hơn khối có thể quản lý được. Tôi thấy rằng như MySQL 5.1 có một phân vùng tùy chọn và đó là một lựa chọn có thể nhưng tôi không thích cách cột xác định phân vùng phải là một phần của khóa chính trên bảng. Điều tôi thực sự muốn làm là chia bảng mà mô hình AR ghi thành dựa trên các giá trị được viết nhưng theo như tôi biết không có cách nào để làm điều này - có ai có bất kỳ đề xuất nào làm thế nào tôi có thể thực hiện điều này hoặc bất kỳ chiến lược thay thế nào?Chiến lược xử lý các bảng db lớn

Cảm ơn

Arfon

Trả lời

5

cột phân vùng trong MySQL không giới hạn khóa chính. Trong thực tế, một cột phân vùng không phải là một chìa khóa ở tất cả (mặc dù một sẽ được tạo ra cho nó minh bạch). Bạn có thể phân vùng bằng RANGE, HASH, KEY và LIST (tương tự như RANGE chỉ là một tập hợp các giá trị rời rạc). Đọc hướng dẫn sử dụng MySQL cho an overview của các loại partioning.

Có các giải pháp thay thế như HScale - trình cắm thêm phần mềm trung gian phân vùng bảng minh bạch dựa trên các tiêu chí nhất định. HiveDB là một khung công tác mã nguồn mở cho phân chia ngang cho MySQL.

Ngoài việc vứt bỏ và chia tay bạn nên sử dụng một số loại phân cụm. Việc thiết lập đơn giản nhất là thiết lập dựa trên bản sao giúp bạn trải rộng tải trên một số máy chủ vật lý. Bạn cũng nên xem xét các giải pháp phân cụm nâng cao hơn như cụm MySQL (có thể không phải là một tùy chọn do kích thước của cơ sở dữ liệu của bạn) và phần mềm trung gian phân cụm như Sequioa.

Tôi thực sự đã hỏi một câu hỏi có liên quan về scaling with MySQL ở đây về chồng tràn một thời gian trước đây, mà tôi đã trả lời bản thân vài ngày sau đó sau khi thu thập rất nhiều thông tin về chủ đề này. Có thể phù hợp với bạn.

1

Nếu bạn muốn chia dữ liệu của mình theo thời gian, giải pháp sau có thể phù hợp với nhu cầu của bạn. Bạn có thể sử dụng các bảng MERGE;

Giả sử bảng của bạn được gọi MyTable và rằng bạn cần một bảng mỗi tuần

  1. Ứng dụng của bạn luôn ghi lại trong cùng một bảng
  2. Một công việc hàng tuần nguyên tử đổi tên bảng của bạn và tái tạo lại một trống một: MyTable được đổi tên thành MyTable-Year-WeekNumber và một MyTable trống mới được tạo ra
  3. Các bảng hợp nhất bị xóa và tạo lại.

Nếu bạn muốn nhận tất cả dữ liệu trong ba tháng qua, bạn tạo bảng hợp nhất chỉ bao gồm các bảng trong 3 tháng qua. Tạo nhiều bảng hợp nhất khi bạn cần các khoảng thời gian khác nhau.Nếu bạn có thể không bao gồm bảng trong đó dữ liệu hiện được chèn (MyTable trong ví dụ của chúng tôi), bạn sẽ hài lòng hơn, vì bạn sẽ không có bất kỳ đọc/ghi đồng thời

1

Bạn có thể xử lý hoàn toàn trong Active Record sử dụng DataFabric.

Việc thực hiện hành vi tương tự cũng không phức tạp nếu điều đó không phù hợp. Google sharding cho rất nhiều cuộc thảo luận về mô hình kiến ​​trúc xử lý phân vùng bảng trong tầng ứng dụng. Nó có những ưu điểm của việc tránh middleware hoặc tùy thuộc vào các tính năng cụ thể của db vender. Mặt khác, nó là nhiều mã trong ứng dụng của bạn mà bạn chịu trách nhiệm.

Các vấn đề liên quan