2012-04-12 45 views
5

Tôi hiện đang lưu trữ từng chế độ xem trong cơ sở dữ liệu với IP người dùng, ngày xem v.v. Nhưng trang web của tôi có số lượt truy cập lớn và tăng thời gian khóa cơ sở dữ liệu và giảm hiệu suất.Chiến lược đếm số lần xem tốt nhất

Tôi đã suy nghĩ để lưu số lượng trong một tệp trong 1 giờ và sau đó cập nhật cơ sở dữ liệu nhưng ai đó nói với tôi rằng chúng tôi không sử dụng thao tác tệp cho các trang tải nặng.

Vui lòng đề xuất chiến lược tốt nhất để thực hiện việc này.

Lưu ý: Tôi không cần tính lượt xem duy nhất.

+0

Tôi nghĩ giao dịch có thể tốt. – hjpotter92

+0

Đây có phải là mục đích phân tích không? Nếu có, bạn có thể cân nhắc sử dụng một dịch vụ miễn phí như Google Analytics hoặc Jetpack để theo dõi lượt xem thay thế. –

+0

Tôi có nên cân nhắc sử dụng bộ nhớ cache APC để lưu dữ liệu vào bộ đệm trước và sau đó cập nhật nó vào cơ sở dữ liệu sau một số chế độ xem ...? –

Trả lời

1

Nhật ký máy chủ web của bạn sẽ theo dõi nhiều dữ liệu này cho bạn.

Những gì tôi đề nghị là xoay nhật ký một lần một giờ và sau đó có một công việc theo lịch trình tạo ra số liệu thống kê tổng hợp và lưu trữ chúng trong DB.

+0

Có vẻ rất tuyệt.Tôi không có nhiều kiến ​​thức về máy chủ, bạn có thể vui lòng cho tôi biết nơi tôi có thể tìm thấy nhật ký máy chủ web –

+0

Bạn đang sử dụng máy chủ web nào và hệ điều hành nào? –

0

Sẽ không có vấn đề gì khi giữ và cập nhật thông tin này trực tiếp trong MySQL. 3000 lượt truy cập mỗi giờ có nghĩa là ít hơn một truy vấn mỗi giây. Sử dụng công cụ lưu trữ InnoDB cho bảng này nên loại bỏ các vấn đề về khóa. Tuy nhiên InnoDB có rất nhiều tùy chọn và nó cần phải được cấu hình đúng cách để hoạt động hiệu quả - điều này là quan trọng.

Dựa trên ý kiến ​​của bạn tôi nghĩ rằng cấu trúc bạn đang tìm kiếm sẽ giống như thế:

id - page id 
type - period length, could be 'day', 'week', 'month' 
period - date when period starts, could be integer written as YYYYMMDD or YYYYMM 
     - depending on the contents of 'type' field 
count - hit count for a url over given period 

Các khóa chính sẽ là (type, period, id). Ngoài ra chỉ số về (id, period) và trên (type, period, count) cho hiệu quả:

SELECT * 
FROM ... 
WHERE type='week' 
    and period = 20120409 
ORDER BY count DESC 

Khi trang web được tạo ra, hồ sơ chèn cho từng giai đoạn với count = 0. Khi trang bị một hit, chạy một bản cập nhật đơn giản:

UPDATE table 
SET count = count + 1 
WHERE id = $page_id 
    AND period IN (201204, 20120409) 

Nó sẽ cập nhật tất cả ba hồ sơ cho thống kê 'ngày', 'tuần' và 'tháng'.

+0

Tôi không lưu trữ loại chế độ xem, thay vào đó tính toán loại chế độ xem theo ngày. Thậm chí không có URL là ID đủ trong trường hợp của tôi. Nhưng tôi đang cập nhật cơ sở dữ liệu trên mỗi chế độ xem. –

+0

Việc cập nhật thông tin này trên mỗi chế độ xem sẽ không thành vấn đề với chỉ 1 lần xem trang mỗi giây. – Mushu

+0

Và nếu bạn có thể sử dụng ID thay vì URL, thì cột url sẽ không cần thiết. Chỉ 'id' mang giá trị id trang thay vì tăng tự động sẽ đủ. – Mushu

0

Đã có một plugin thực hiện điều này rất hiệu quả (mặc dù bạn phải tìm cách sử dụng dữ liệu để sắp xếp bài đăng, v.v.): Số lượt xem bài đăng BAW. Nó lưu trữ tất cả mọi thứ trong postmeta, do đó, nó dễ dàng để có được, và duy trì hàng ngày và tổng số khác trong các mục meta riêng biệt. Tôi sử dụng nó trên một số trang web, với thời gian 50.000 lượt xem trang mỗi ngày và nó không làm chậm bất cứ điều gì.

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