2011-12-20 18 views
6

Làm thế nào để xây dựng một cấu trúc thích hợp cho một dịch vụ phân tích? Hiện tại tôi có 1 bảng lưu trữ dữ liệu về mọi người dùng truy cập trang bằng ID của khách hàng của tôi để sau này khách hàng của tôi có thể xem thống kê cho một ngày cụ thể.Làm thế nào để xây dựng một cơ sở dữ liệu thích hợp cho một hệ thống phân tích lưu lượng truy cập?

Tôi đã suy nghĩ một chút và tôi tự hỏi: Giả sử tôi có 1.000 người dùng và mỗi người có khoảng 1.000 lần hiển thị trên trang web của họ hàng ngày, có nghĩa là tôi nhận được 1.000.000 (1 triệu) bản ghi mới mỗi ngày vào một bảng. Làm thế nào nó sẽ làm việc sau 2 tháng hoặc lâu hơn (khi bảng đạt 60 triệu hồ sơ)?

Tôi chỉ nghĩ rằng sau một thời gian nó sẽ có nhiều bản ghi rằng các truy vấn PHP để rút ra dữ liệu sẽ thực sự nặng, chậm và mất rất nhiều tài nguyên, có đúng không? và làm thế nào để ngăn chặn điều đó?

Một người bạn của tôi làm việc trên một cái gì đó tương tự và anh ta sẽ tạo một bảng mới cho mọi khách hàng, đây có phải là cách chính xác để đi cùng không?

Cảm ơn!

+0

xem xét việc giới thiệu một cuốn sách! – linuxeasy

+1

@linuxeasy cái nào? – k102

Trả lời

1

Consider this Link to the Google Analytics Platform Components Overview page và đặc biệt chú ý đến cách dữ liệu được ghi vào cơ sở dữ liệu, chỉ dựa trên kiến ​​trúc của toàn bộ hệ thống.

Thay vì viết mọi thứ vào cơ sở dữ liệu của bạn ngay lập tức, bạn có thể ghi mọi thứ vào tệp nhật ký, sau đó xử lý nhật ký sau (có thể tại thời điểm lưu lượng truy cập không cao). Vào cuối ngày, bạn vẫn sẽ cần phải làm cho tất cả những ghi vào cơ sở dữ liệu của bạn, nhưng nếu bạn bó chúng lại với nhau và làm chúng khi loại tải là dễ chịu hơn, hệ thống của bạn sẽ quy mô tốt hơn rất nhiều.

+1

đây không phải là câu trả lời, nên là một bình luận! – k102

+0

Liên kết giải thích không có gì về mở rộng quy mô. -1 cho gây hiểu nhầm. –

+0

+1 Đây là một liên kết tốt và liên quan đến chủ đề. Nó sẽ giúp OP đọc nó. – PiTheNumber

-1

Bạn có thể bình thường hóa hiển thị dữ liệu như thế này;

Client Table 
{ 
    ID 
    Name 
} 


Pages Table 
{ 
    ID 
    Page_Name 
} 

PagesClientsVisits Table 
{ 
    ID 
    Client_ID 
    Page_ID 
    Visits 
} 

và chỉ tăng lượt truy cập trên bảng cuối cùng trên mỗi lần hiển thị mới. Sau đó, số lượng tối đa các bản ghi trong đó sẽ trở thành (Số lượng khách hàng * Số trang)

+0

Cảm ơn câu trả lời của bạn nhưng nó không hoạt động theo cách này, số liệu thống kê khá sâu và bảng lưu trữ một kỷ lục mới cho mỗi lượt truy cập với IP và quốc gia của khách truy cập có nghĩa là tôi thực sự không thể viết một số trong 'Lượt truy cập ' . – Ricardo

+0

OK - tôi nghĩ khách hàng của bạn giống như khách truy cập của bạn. Bạn có thể dễ dàng thay thế bảng "Khách hàng" bằng bảng "Khách truy cập" mặc dù vẫn sử dụng kỹ thuật này. Bit khó nhận xét mà không hiểu ứng dụng của bạn tốt hơn một chút. –

-1

Có một bảng với 60 triệu bản ghi có thể được chấp nhận. Đó là cơ sở dữ liệu cho cái gì. Nhưng bạn nên cẩn thận về số lượng trường bạn có trong bảng. Ngoài ra những gì datatype (=> kích thước) mỗi lĩnh vực có.

Bạn tạo một số loại báo cáo về dữ liệu. Hãy suy nghĩ về dữ liệu bạn thực sự cần cho các báo cáo đó. Ví dụ: bạn có thể chỉ cần số lượt truy cập trên mỗi người dùng trên mỗi trang. Một số đơn giản sẽ thực hiện thủ thuật.

Điều bạn cũng có thể làm là tạo báo cáo mỗi đêm và xóa dữ liệu thô sau đó.

Vì vậy, hãy đọc và suy nghĩ về điều đó.

+0

Liên kết vẫn cung cấp 0 thông tin về việc mở rộng cơ sở dữ liệu. –

+0

giải thích tốt để đơn giản hóa mọi thứ! – linuxeasy

2

Sự cố bạn đang gặp phải là hệ thống bị ràng buộc I/O. 1 triệu bản ghi mỗi ngày là khoảng 12 lần ghi mỗi giây. Điều đó có thể đạt được, nhưng kéo dữ liệu ra trong khi viết cùng một lúc sẽ làm cho hệ thống của bạn bị ràng buộc ở mức HDD. Những gì bạn cần làm là cấu hình cơ sở dữ liệu để hỗ trợ khối lượng I/O, chẳng hạn như - sử dụng công cụ cơ sở dữ liệu thích hợp (InnoDB và MyISAM), đảm bảo bạn có hệ thống con HDD đủ nhanh (RAID) , không phải ổ đĩa thông thường vì chúng có thể và sẽ thất bại tại một số điểm), thiết kế cơ sở dữ liệu của bạn một cách tối ưu, kiểm tra các truy vấn với EXPLAIN để xem bạn có thể gặp vấn đề gì với họ, thậm chí có thể sử dụng một công cụ lưu trữ khác - cá nhân, tôi sẽ sử dụng TokuDB nếu tôi là bạn.

Và cũng có thể, tôi chân thành hy vọng bạn sẽ thực hiện truy vấn, phân loại, lọc ở phía cơ sở dữ liệu chứ không phải ở phía PHP.

+0

Vì vậy, đề xuất sử dụng công cụ InnoDB là thông tin phần cứng cho bạn? Ngày đầu đó bạn chọn để downvote một câu trả lời mà thực sự giúp ai đó thiết kế hệ thống. Bạn có nên trả lời các câu hỏi về SO với thái độ đó không hỗ trợ ai? –

+0

không có vấn đề về thái độ với tôi, nhưng với bạn! bất cứ điều gì và mọi thứ có thể cấu thành để thiết kế một hệ thống, ngay từ PHP, phần cứng và chỉ mỗi cái và mọi thứ! tốt hơn chính xác thái độ của bạn và có được những điều đúng trên SO! – linuxeasy

+0

Tôi xin lỗi nhưng tôi sẽ không nhận được trong các tranh cãi trẻ con như vậy với một người dường như không có đầu mối về những gì anh ta nói về. –

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