2010-05-27 43 views
7

Tôi là một nhà phát triển duy nhất cho một công ty viễn thông, và sau một số lời khuyên thiết kế cơ sở dữ liệu từ bất kỳ ai có chút thời gian để trả lời.Tư vấn thiết kế cơ sở dữ liệu cần

Tôi đang chèn vào một bảng ~ 2 triệu hàng mỗi ngày, các bảng này sau đó được lưu trữ và nén hàng tháng. Mỗi bảng hàng tháng chứa ~ 15.000.000 hàng. Mặc dù điều này đang tăng lên hàng tháng.

Đối với mỗi chèn tôi làm ở trên, tôi kết hợp dữ liệu từ các hàng thuộc về nhau và tạo một bảng "tương quan" khác. Bảng này hiện không được lưu trữ, vì tôi cần đảm bảo rằng tôi không bao giờ bỏ lỡ bản cập nhật cho bảng tương ứng. (Hy vọng rằng có ý nghĩa) Mặc dù nói chung thông tin này nên vẫn còn khá tĩnh sau một vài ngày xử lý.

Tất cả những điều trên đều hoạt động hoàn hảo. Tuy nhiên công ty của tôi bây giờ mong muốn thực hiện một số số liệu thống kê chống lại dữ liệu này, và các bảng này đang nhận được quá lớn để cung cấp kết quả trong những gì sẽ được coi là một thời gian hợp lý. Ngay cả với các chỉ mục thích hợp được thiết lập.

Vì vậy, tôi đoán sau khi tất cả câu hỏi trên của tôi khá đơn giản. Tôi có nên viết một tập lệnh mà nhóm dữ liệu từ bảng tương quan của tôi thành các bảng nhỏ hơn. Hoặc tôi nên lưu trữ các tập kết quả truy vấn trong một cái gì đó như memcache? Tôi đã sử dụng bộ nhớ cache mysqls, nhưng do có giới hạn kiểm soát dữ liệu được lưu trữ trong bao lâu, nó không hoạt động lý tưởng.

Những lợi thế chính tôi có thể nhìn thấy của việc sử dụng một cái gì đó giống như memcache:

  • Không chặn trên bảng tương quan của tôi sau khi truy vấn đã được đổi thành tiền mặt.
  • Tính linh hoạt cao hơn trong việc chia sẻ dữ liệu đã thu thập giữa bộ sưu tập phụ trợ và bộ xử lý đầu cuối. (tức là báo cáo tùy chỉnh có thể được viết trong phụ trợ và kết quả của các bộ nhớ này được lưu trữ trong bộ nhớ cache dưới khóa mà sau đó được chia sẻ với bất kỳ ai muốn xem dữ liệu của báo cáo này)
  • Dự phòng và khả năng mở rộng nếu chúng tôi bắt đầu chia sẻ dữ liệu này với số lượng lớn khách hàng.

Những khó khăn chính tôi có thể nhìn thấy của việc sử dụng một cái gì đó giống như memcache:

  • dữ liệu là không dai dẳng nếu máy được khởi động lại/bộ nhớ cache bị xóa.

Các ưu điểm chính của việc sử dụng MySql

  • dữ liệu liên tục.
  • thay đổi mã Less (mặc dù thêm cái gì đó như memcache là tầm thường nào)

Những khó khăn chính của việc sử dụng MySql

  • Phải xác định bảng mẫu mỗi khi tôi muốn lưu trữ cung cấp một mới thiết lập dữ liệu được nhóm.
  • Phải viết chương trình lặp lại thông qua dữ liệu tương quan và điền vào các bảng mới này.
  • Có khả năng sẽ vẫn phát triển chậm hơn khi dữ liệu tiếp tục được lấp đầy.

Xin lỗi cho một câu hỏi khá dài. Nó đã giúp tôi viết ra những suy nghĩ này ở đây, và bất kỳ lời khuyên/giúp đỡ/kinh nghiệm đối phó với loại vấn đề này sẽ được đánh giá cao.

Rất cám ơn.

Alan

+5

Chào mừng bạn đến với StackOverflow. Câu hỏi dài thường tốt, vì chúng có xu hướng hiển thị một vài điều quan trọng, 1) bạn thực sự quan tâm đến việc nhận được câu trả lời hay thay vì 'cho tôi mã' 2) chúng có xu hướng có tất cả (hoặc ít nhất là hầu hết) thông tin cần thiết để trả lời chính xác câu hỏi, sau khi tất cả rác trong == rác ra. – UnkwnTech

Trả lời

2

Bên cạnh các tùy chọn bạn thảo luận ở trên, bạn cũng có thể muốn cân nhắc việc thêm phần cứng mạnh mẽ hơn vào hình ảnh, nếu thats một lựa chọn.

chút này của câu hỏi của bạn cho thấy rằng vấn đề cơ bản ở đây là tốc độ kết quả:

Tuy nhiên công ty của tôi bây giờ muốn thực hiện một số số liệu thống kê đối với dữ liệu này, và các bảng đang nhận được quá lớn để cung cấp kết quả trong những gì sẽ được coi là một thời gian hợp lý.

Trong trường hợp tốc độ của kết quả là quan trọng, việc ném phần cứng tốt hơn/bổ sung vào vấn đề thường có thể làm việc rẻ hơn phát triển các cấu trúc mã/cơ sở dữ liệu mới.

Chỉ là một ý nghĩ!

+0

Sau khi đọc qua câu hỏi suy nghĩ đầu tiên của tôi là 'Morez hardz' nhưng có vẻ như tôi đã bị đánh bại. –

+0

Cảm ơn, tôi đoán tuy nhiên nút cổ chai của tôi bây giờ là hoàn toàn trên I/O trên trích xuất dữ liệu từ ổ đĩa cứng? Tôi không chắc chắn tôi sẽ sử dụng giải pháp nào ngay cả khi tôi thông qua một máy khác/ổ đĩa khác vào phương trình? Tất nhiên có ổ SSD tôi đoán? –

+0

Nếu MySql đang lưu trữ các khối dữ liệu trong bộ nhớ thì I/O không nhất thiết phải là nút cổ chai. Có thể làm một số giám sát để tìm hiểu xem nó có hay không. – codeulike

1

(Một câu trả lời từ tôi, đủ khác nhau mà tôi sẽ đăng nó riêng)

Hai câu hỏi:

Những loại số liệu thống kê nào công ty của bạn muốn tạo ra?

Sau khi các hàng được chèn vào cơ sở dữ liệu, chúng có thay đổi không?

Nếu dữ liệu không thay đổi sau khi chèn, bạn có thể tạo bảng 'thống kê' riêng, bạn sửa đổi/cập nhật khi hàng mới được chèn vào hoặc có thể ngay sau khi chèn hàng mới.

ví dụ: những thứ như:

  • Khi một hàng mới được chèn thats liên quan đến stat 'B', đi và tăng một số trong bảng khác cho stat 'B', phút 'Y'
    hoặc
  • Mỗi giờ, chạy một truy vấn nhỏ trên các hàng đã được chèn trong giờ cuối cùng, mà tạo ra các số liệu thống kê cho giờ đó và lưu trữ chúng riêng
    hoặc
  • Như trên, nhưng mỗi phút vv

của nó khó có thể bất kỳ chi tiết nào khác fic mà không biết chi tiết, nhưng tùy thuộc vào số liệu thống kê bạn đang theo dõi, những cách tiếp cận này có thể hữu ích.

+0

Số liệu thống kê cơ bản như số phút nhóm theo điểm đến. nhóm đếm theo đích, số liệu thống kê nhóm của khách hàng. Tất cả thông tin nằm trong bảng tương ứng. Có nghĩa là tôi phải chờ cho đến khi tôi có dữ liệu tương quan hoàn chỉnh. Với ba giải pháp trên, bạn sẽ ưu tiên những giải pháp nào? Rõ ràng là việc chèn và cập nhật cho mỗi lần chèn sẽ làm chậm tốc độ mà tại đó tôi có thể thực hiện chèn bản ghi hoàn chỉnh. –

+0

Nếu bạn có thể cập nhật số liệu thống kê khi mọi lần chèn xảy ra (dưới đây là những gì người dùng đề nghị, bên dưới), thì điều đó đơn giản hơn về mặt khái niệm, nhưng khi bạn nói làm cho bản cập nhật chậm hơn. Ngoài ra nó làm tăng khả năng lỗi trong mã chèn, mà bạn không muốn. Một quá trình riêng biệt mà tạo ra số liệu thống kê cho chèn gần đây mỗi n phút là an toàn hơn và (trong lý thuyết) sẽ không làm chậm chèn xuống. Nhưng hơi khó mã hơn. – codeulike

1

Nếu bạn muốn thực hiện một số phân tích dữ liệu tĩnh từ một vài ngày trở lại, bạn có lẽ nên xem xét sử dụng một cái gì đó giống như một hệ thống OLAP.

Cơ bản, loại thống kê trung gian chứng khoán hệ thống này ở định dạng của chúng để thực hiện tổng nhanh(), avg(), đếm() ... trên bảng lớn.

Tôi nghĩ câu hỏi của bạn là một ví dụ hoàn hảo về tình huống mà nó được sử dụng, nhưng có lẽ tôi nghĩ như vậy chỉ vì đó là công việc của tôi. =)

Hãy xem.

+0

Cảm ơn rất nhiều, tôi sẽ xem OLAP ngay bây giờ –

1

Tôi làm việc trong một công ty có tình huống tương tự, với hàng triệu lần chèn hàng tháng.

Chúng tôi đã áp dụng chiến lược tóm tắt dữ liệu trong các bảng nhỏ hơn, được nhóm theo một số trường nhất định.

Trong trường hợp của chúng tôi, khi chèn được thực hiện, nó sẽ kích hoạt một hàm phân loại tuple được chèn và tăng các bảng tóm tắt.

Thỉnh thoảng, chúng tôi di chuyển các hàng cũ nhất sang bảng sao lưu, giảm sự tăng trưởng của bảng chính.

+0

Có vẻ như đây là con đường tiến lên! Cảm ơn vì đã trả lời. –

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