2011-06-20 36 views
7

Tôi có một bảng MySql trong đó bao gồm:Lớn bảng MySql đặt quá nhiều tải trọng trên máy chủ

  1. ~ 25million hàng (hiện tại)
  2. 3 chỉ số
  3. Mỗi ngày, một trình thu thập thêm ~ hàng 3 triệu
  4. tôi đang không nhìn quá xa, nhưng một ước tính cuối cùng của db có thể ~ CONST * rows E9
  5. hiện nay 9.5giga
  6. InnoDB và nó đang được đọc trong khi chèn

Bản thân dữ liệu bao gồm văn bản ~ 100 ký tự + một số trường có dữ liệu meta về nó. Các chỉ mục là id duy nhất, tên nhà văn và id nhà văn.

Cho đến bây giờ, mọi thứ suôn sẻ, nhưng hiện tại máy chủ đang gặp khó khăn trong việc xử lý chèn dữ liệu mới (~ 10 giây cho mỗi lần chèn có thêm 3k dòng). Tôi đang cố gắng tìm cách khắc phục vấn đề này. Những điều tôi xem xét:

  1. Làm chỉ mục trong khi chèn nỗ lực. Có thể không làm điều đó trong khi chèn, và chỉ sau khi X chèn thêm các chỉ mục.
  2. Phân vùng dữ liệu thành các bảng khác nhau.
  3. Thu thập dữ liệu vào một db nhỏ và mỗi X phút/ngày, chuyển dữ liệu vào db lớn.
  4. Chuyển sang một db khác. Tôi không đủ quen với NoSql, điều đó có giúp tôi giải quyết những vấn đề này không? Có phải là một nỗ lực lớn để sử dụng nó?

Mỗi tùy chọn có tùy chọn phụ và tình trạng khó xử của nó, nhưng tôi nghĩ trước tiên tôi nên tập trung vào việc có hướng. Tôi nên đi đường nào và tại sao? Có một con đường khác tôi nên nghĩ đến không?

BTW - Ngoài ra còn có tùy chọn để không giữ tất cả dữ liệu và chỉ các phần tôi thực sự hiển thị, nhưng điều đó sẽ không thể thực hiện một số thay đổi chức năng trong quá trình mà dữ liệu đang trải qua trước khi được hiển thị.

+0

Dữ liệu trông như thế nào? Và các chỉ mục? – z5h

+0

Đã cập nhật câu hỏi với câu trả lời cho câu hỏi của bạn. – Noam

+0

innodb hoặc myisam? Bảng đang được sử dụng cho các truy vấn đọc trong khi bạn đang chèn? – ggiroux

Trả lời

1

là động cơ hiện tại tối ưu cho việc sử dụng?

Bạn đã concidered http://dev.mysql.com/doc/refman/5.1/en/partitioning-management.html

+0

Tôi chưa có. Tôi giả định rằng phù hợp với các lựa chọn số 2. Điều đó có đủ để xem xét các con số của tôi không? – Noam

+0

Nhu cầu và sử dụng dữ liệu khác là gì và mức độ chuyên sâu như thế nào? –

+0

Dữ liệu này đang được đọc từ đến db với mỗi lần truy cập vào trang web. Đây là dữ liệu chính mà trang web được xây dựng trên – Noam

1

Nếu bạn đang thêm 3.000.000 hàng một ngày, và 3000 hàng có một giao dịch 10 giây, bạn đang nói khoảng 1.000 giao dịch mỗi ngày, mà phải mất khoảng 170 phút mỗi ngày. Đó thực sự không phải là nhiều.

Tôi nghĩ rằng lần đầu tiên tôi muốn thử

  1. giảm số lượng INSERT giao dịch bằng cách chèn nhiều hàng mỗi giao dịch
  2. chỉnh server

Bạn có thể thấy rằng chèn nhiều hàng mỗi giao dịch thực sự mất ít thời gian tổng thể hơn. Và nếu không, thật dễ dàng để hoàn nguyên. Nếu bạn stash các hàng ở một nơi khác đầu tiên, bạn có thể chạy các giao dịch INSERT trong thời gian tải thấp.

Điều chỉnh máy chủ có lẽ là một ý tưởng hay. Để tham khảo, hãy xem tài liệu MySQL trên Tuning Server Parameters.

+0

Bạn có thể xây dựng trên "điều chỉnh máy chủ" không? – Noam

+0

Tôi đã thêm một liên kết đến "Tuning Server Parameters". –

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