Я построил простой счетчик посещений на своем сайте (PHP & MySQL, используя Codeigniter в качестве моей основы).
Это таблица, которую я использую:
CREATE TABLE page_hits (id INT NOT NULL AUTO_INCREMENT, page_url VARCHAR(350) NOT NULL, ip VARCHAR(11) NOT NULL, hits INT NOT NULL, `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY (id));
На каждой загрузке страницы я проверяю page_url
& ip
существует в таблице. Если это так, я увеличиваю значение hits
на 1. Если нет, я создаю новую строку в таблице. Временная метка предназначена для того, чтобы обеспечить определенную задержку между счетчиками обращений, чтобы не считать обновление страницы новым попаданием.
Все это работает хорошо, но я боюсь, что я перегружаю свою базу данных …
Менее чем за 24 часа у меня есть более 6500 строк в page_hits
Таблица.
Итак, мой вопрос: каковы риски наличия такой быстро растущей таблицы в моей базе данных? (проблемы с производительностью? превышение ограничения размера базы данных?)
Позвольте мне начать с переписывания вашей однострочной команды SQL:
CREATE TABLE page_hits
(id INT NOT NULL AUTO_INCREMENT,
page_url VARCHAR(350) NOT NULL,
ip VARCHAR(11) NOT NULL,
hits INT NOT NULL,
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id))
Теперь я могу видеть, что там.
Ваш стол не сложен, но он будет быстро расти. Это не будет проблемой, если вы ничего с этим не делаете. Другими словами: добавление строк в таблицу не является проблемой, даже если у вас есть миллион строк.
Однако, как только вы начнете запрашивать эту таблицу, вы обнаружите, что она очень медленно работает. Вы забыли добавить индексы.
Как добавить индексы в таблицы MySQL?
Во-вторых, вы можете подумать о нормализации своей таблицы и избавиться от ненужной информации. Например, эти три меньшие таблицы:
CREATE TABLE page_hits
(id INT NOT NULL AUTO_INCREMENT,
page_id INT NOT NULL,
client_id INT NOT NULL,
hits INT NOT NULL,
PRIMARY KEY (id))
CREATE TABLE pages
(id INT NOT NULL AUTO_INCREMENT,
page_url VARCHAR(350) NOT NULL,
PRIMARY KEY (id))
CREATE TABLE clients
(id INT NOT NULL AUTO_INCREMENT,
ip VARCHAR(11) NOT NULL,
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id))
Вот page_id
относится к pages
стол и client_id
относится к clients
Таблица. Вы должны будете добавить индексы самостоятельно. Я бы избавился от date
столбец, и решить эту проблему с помощью cookie. Обратите внимание, что новые таблицы могут быть легко расширены, чтобы содержать больше информации без слишком большого увеличения.
Других решений пока нет …