2010-08-17 3 views
3

Что такое лучшая модель базы данных для хранения посещений пользователей и подсчета уникальных пользователей с использованием IP-адреса в большой базе данных с 1.000.000 строк?Система статистики PHP и MySQL

SELECT COUNT(DISTINCT ip) FROM visits 

Но с 1.000.000 разным IP-адресом это может быть медленный запрос. Кэширование не вернет действительное число.

Сколько систем статистики учитывает уникальные посещения?

ответ

2

Есть еще одну таблицы MyISAM только с колонкой IP и UNIQUE индексом на нем. Вы получите надлежащее количество в кратчайшие сроки (MyISAM кэширует количество строк в таблице)

[добавлены после комментариев]

Если вы также должны рассчитывать визиты каждого IP, добавьте еще один столбец visitCount и использовать

INSERT INTO 
    visitCounter (IP,visitCount) 
VALUES 
    (INET_ATON($ip),1) 
ON DUPLICATE KEY UPDATE 
    SET visitCount = visitCount+1 
+0

@ Mchl, если столбец IP UNIQUE не будет, что таблица всегда возвращает COUNT = 1 за IP? – Frankie

+0

Это будет, но я понял, что Уильям хотел подсчитать количество всех отдельных IP-адресов. Это все равно можно изменить, добавив поле 'count' и используя синтаксис 'INSERT ... ON DUPLICATE KEY UPDATE ...' – Mchl

+0

Для уникальных посещений это хорошее решение. Сохраните уникальный IP-адрес и фактическую временную метку – Wiliam

2

Не используйте для этого реляционную базу данных. Он не предназначен для хранения такого типа информации.

Вы можете попробовать базу данных NoSQL , такую ​​как Mongo (Я знаю, что многие места используют это для их регистрации, так как у нее так мало накладных расходов).

Если вы должны придерживаться MySQL, вы можете добавить индекс к ip колонку, которая должна значительно ускорить процесс ...

+2

Вот что я хотел бы предложить. Кроме того, подумайте о концепции расчета уникальных пользователей. Рассчитайте его только один раз, а затем повторно используйте. Количество вчерашних уникальных посетителей не изменится. Количество уникальных посетителей на прошлой неделе также не изменится. – dwich

+2

Исходя из этого, вы можете очертить в день/неделю/месяц/что угодно и создать новую таблицу для каждого нового периода. Таким образом, вы все еще сохраняете информацию (если вам это действительно нужно), и получите прирост производительности при работе с относительно небольшими таблицами. Но я должен спросить, почему вам нужно сохранить столько данных? Почему бы просто не суммировать один раз в день, а затем удалять через месяц или два? – ircmaxell

+0

Я знаю, как использовать индексы ... Я только прошу модели БД для высоконаселенных баз данных. Мне нужно сохранить все данные, потому что моя фреймворк нуждается во всей информации обо всех клиентах на разных серверах для достижения стадистики и других вещей. Спасибо (Что быстрее, INDEX IP или другое решение, сделайте таблицу с уникальными IP-адресами?) – Wiliam

Смежные вопросы