2010-11-15 41 views
8

Tôi đang làm việc không có một trang web mà các cửa hàng xem trang cá nhân trong một 'quan' bảng:Cách tốt nhất để lưu trữ views/số liệu thống kê trong MySQL

CREATE TABLE `views` (
    `view_id` bigint(16) NOT NULL auto_increment, 
    `user_id` int(10) NOT NULL, 
    `user_ip` varchar(15) NOT NULL, 
    `view_url` varchar(255) NOT NULL, 
    `view_referrer` varchar(255) NOT NULL, 
    `view_date` date NOT NULL, 
    `view_created` int(10) NOT NULL, 
    PRIMARY KEY (`view_id`), 
    KEY `view_url` (`view_url`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

Nó khá cơ bản, các cửa hàng user_id (id của người dùng trên trang web), địa chỉ IP của họ, url (không có miền để giảm kích thước của bảng một chút), url giới thiệu (không thực sự sử dụng ngay bây giờ và có thể loại bỏ nó), ngày (YYYY-MM-DD định dạng của khóa học) và dấu thời gian unix khi lượt xem xảy ra.

Bảng, tất nhiên, đang nhận được khá lớn (4 triệu hàng tại thời điểm này và nó là một trang web khá trẻ) và chạy truy vấn trên đó là chậm.

Đối với một số tối ưu hóa cơ bản bây giờ tôi đã tạo ra một bảng 'views_archive':

CREATE TABLE `views_archive` (
    `archive_id` bigint(16) NOT NULL auto_increment, 
    `view_url` varchar(255) NOT NULL, 
    `view_count` smallint(5) NOT NULL, 
    `view_date` date NOT NULL, 
    PRIMARY KEY (`archive_id`), 
    KEY `view_url` (`view_url`), 
    KEY `view_date` (`view_date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

này bỏ qua thông tin người dùng (và url giới thiệu) và các cửa hàng có bao nhiêu lần một url được xem mỗi ngày. Đây có lẽ là cách chúng ta thường muốn sử dụng dữ liệu (số lần trang được xem mỗi ngày) nên truy vấn khá nhanh, nhưng ngay cả khi tôi sử dụng nó để chủ yếu thay thế bảng 'lượt xem' (phải bây giờ tôi tưởng tượng tôi có thể hiển thị lượt xem trang theo giờ cho tuần cuối cùng/tháng trước và sau đó hiển thị lượt xem hàng ngày ngoài đó và vì vậy sẽ chỉ cần bảng 'lượt xem' để chứa dữ liệu từ tuần trước/tháng) nhưng vẫn lớn bàn.

Dù sao, câu chuyện dài ngắn, tôi tự hỏi bạn có thể cho tôi bất kỳ mẹo nào về cách xử lý tốt nhất số liệu thống kê/lượt xem trang trong một trang web MySQL hay không, mục tiêu là giữ cả kích thước của bảng (s) trong db càng nhỏ càng tốt và vẫn có thể dễ dàng (và ít nhất là tương đối nhanh) truy vấn thông tin. Tôi đã xem xét các bảng được phân đoạn một chút, nhưng trang web không cài đặt MySQL 5.1. Bất kỳ lời khuyên hay suy nghĩ khác bạn có thể cung cấp sẽ được nhiều đánh giá cao.

+0

umm, doesn Máy chủ của bạn có nhật ký truy cập đã lưu tất cả dữ liệu này không? Có rất nhiều người xem nhật ký/tóm tắt ở đó cho nhật ký truy cập web. Có lý do thuyết phục nào không sử dụng một trong số họ không? – dnagirl

+0

Mục đích của cột view_created là gì? –

+0

Mục đích của cột view_created, MicWafflestix, sẽ được sử dụng nếu tôi muốn hiển thị số lượt xem theo giờ (cho biết số lần bài viết được xem mỗi giờ ngày hôm nay). Tôi cho rằng tôi có thể sử dụng DATETIME thay vì dấu thời gian INT (10), nhưng tôi không chắc chắn sẽ giúp tôi rất nhiều. – Charlie

Trả lời

1

Bạn có thể muốn có một bảng chỉ dành cho các trang và có chế độ xem của người dùng có tham chiếu đến bảng đó. Một tối ưu hóa có thể khác là để cho người dùng IP được lưu trữ trong một bảng khác, có lẽ một số thông tin về bảng phiên. Điều đó sẽ giảm thời gian truy vấn của bạn một chút. Bạn đang đi đúng hướng với bảng lưu trữ; cùng một sự tối ưu hóa cũng sẽ giúp điều đó.

+0

Tôi thích ý tưởng này. Có vẻ như một số cơ sở dữ liệu khá cơ bản, tối ưu hóa cấu trúc dữ liệu (trái ngược với việc nâng cấp mysql hoặc sử dụng bảng nosql hoặc một số thay đổi lớn khác mà tôi sợ tôi phải làm). Tôi cũng vừa phát hiện ra hàm INET_ATON() trong MySQL có thể giúp tôi giảm dung lượng lưu trữ địa chỉ IP (có thể sử dụng INT thay vì VARCHAR). Đối với ngắn hạn, dù sao, tôi nghĩ rằng các giải pháp bạn đã đề cập sẽ đi một chặng đường dài trong việc sửa chữa các vấn đề của tôi. Cảm ơn. – Charlie

+0

@Charlie: bạn được chào đón. Ở quy mô lớn, tối ưu hóa nhỏ thực sự bắt đầu tạo sự khác biệt lớn; cùng một lúc, một số tối ưu hóa thực sự phức tạp chỉ không mang lại lợi nhuận thường được mong đợi. Tôi thấy đi cho việc tối ưu hóa đơn giản, đơn giản đầu tiên thường là những gì giúp tôi 90% con đường đến một giải pháp tốt, nếu không phải tất cả các con đường ở đó. –

1

Lưu trữ Storage Engine MySQL của

http://dev.mysql.com/tech-resources/articles/storage-engine.html

Nó là rất tốt cho các bản ghi, đó là nhanh chóng để viết, một trong những nhược điểm đang đọc là chậm hơn một chút. nhưng nó là tuyệt vời cho các bảng đăng nhập.

+0

Tôi liếc nhìn nó một chút ngày hôm trước. Có vẻ thú vị, nhưng nó không được 'hỗ trợ' (được kiểm tra qua SHOW ENGINES; truy vấn) trên bản cài đặt MySQL hiện tại của tôi. Tôi sẽ hỏi những người lưu trữ để bật nó hoặc bất cứ điều gì và chơi xung quanh với nó. Cảm ơn vì tiền hỗ trợ. – Charlie

+0

Liên kết bị hỏng. –

0

Giả sử ứng dụng của bạn là blog và bạn muốn theo dõi lượt xem cho bài đăng trên blog của mình, có thể bạn sẽ có một bảng gọi là blog_posts. Trong bảng này, tôi đề nghị bạn tạo một cột được gọi là "các khung nhìn" và trong cột này, bạn sẽ lưu trữ một giá trị tĩnh của số lần xem bài đăng này có. Bạn vẫn sẽ sử dụng bảng views, nhưng điều đó sẽ chỉ được sử dụng để theo dõi tất cả các chế độ xem (và thực hiện kiểm tra nếu chúng là "duy nhất" hay không).

Về cơ bản, khi người dùng truy cập bài đăng trên blog, nó sẽ kiểm tra bảng views để xem liệu nó có nên được thêm vào hay không. Nếu có, nó cũng sẽ tăng trường "lượt xem" trong hàng tương ứng cho bài đăng trên blog trong blog_posts. Bằng cách đó, bạn chỉ có thể tham khảo trường "lượt xem" cho mỗi bài đăng để xem nhanh số lượng lượt xem. Bạn có thể thực hiện bước này thêm một bước nữa và thêm hiệu ứng bằng cách thiết lập công việc CRON để đếm lại và xác minh tất cả các chế độ xem và cập nhật từng hàng blog_posts tương ứng vào cuối ngày.Hoặc nếu bạn thích, bạn cũng có thể thực hiện tính lại trên mỗi cập nhật nếu độ chính xác đến giây là khóa.

Giải pháp này hoạt động tốt nếu trang web của bạn được đọc thâm canh và bạn thường xuyên phải nhận được một đếm bao nhiêu lượt xem mỗi bài đăng blog có (một lần nữa, giả định rằng là :-) ứng dụng của bạn)

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