Я разрабатываю специальный инструмент отслеживания для маркетинговых кампаний. Этот инструмент находится посередине между рекламой и целевыми страницами. Он заботится о сохранении всех данных от пользователя, таких как информация в пользовательском агенте, IP-адрес, клики на целевой странице и данные геокодирования IP-адресов пользователей (страна, провайдер и т. Д.).
На данный момент у меня есть некоторые проблемы с дизайном:
После процесса сохранения система должна выполнить перенаправление на целевую страницу. Время важно, чтобы не потерять возможное преимущество.
В основном я нахожу лучшие решения для:
Есть ли у вас предложения? Заранее спасибо.
Одна таблица на пользователя — еще хуже; не делай этого
Миллионы строк в день — десятки, может быть, сотни в секунду? Это, вероятно, требует некоторой формы «постановки» — сбор нескольких строк, а затем их пакетная вставка. Перед дальнейшим обсуждением, пожалуйста, уточните поток данных: один против нескольких клиентов. Пользовательский интерфейс против пакетных процессов. предварительный CREATE TABLE
, И т.п.
Статистический — План создания и поэтапного ведения «Сводных таблиц».
Вы пытаетесь сопоставить IP-адреса пользователей со страной? Это отдельный вопрос, и на него дан ответ.
«Должен», «в реальном времени», «миллисекунды». Признайтесь, вам придется сделать некоторые компромиссы.
Более подробная информация: Перейти к http://mysql.rjweb.org/ ; оттуда, посмотрите три блога по методам хранилища данных.
Как хранить по дням
InnoDB хранит данные в PRIMARY KEY
порядок. Таким образом, чтобы получить все строки за один день, смежные друг с другом, необходимо Начните ПК с датой и временем. Для огромных баз данных может значительно улучшить некоторые запросы, позволяя запросу сканировать данные последовательно, минимизируя тем самым дисковый ввод-вывод.
Если у вас уже есть id AUTO_INCREMENT
(и если вам это по-прежнему нужно), то сделайте следующее:
PRIMARY KEY(datetime, id), -- to get clustering, and be UNIQUE
INDEX(id) -- to keep AUTO_INCREMENT happy
Если у вас есть данные за год, и данные не помещаются в ОЗУ, то этот метод очень эффективен для небольших временных интервалов. Но если ваш временной диапазон больше, чем кэш, вы будете зависеть от скорости ввода-вывода.
Ведение сводных таблиц с изменением данных
это может быть возможным; Мне нужно лучше понять данные и изменения.
Вы не могу сканировать миллион строк за доли секунды, независимо от кэширования, настройки и других оптимизаций. Вы Можно сделать нужные данные с помощью сводной таблицы намного быстрее.
Сожмите данные
BIGINT
(8 байт), если INT
(4 байта) будет достаточно; не использовать INT
если MEDIUMINT
(3 байта) будет делать. И т.п.UNSIGNED
где уместно.Меньшие данные сделают его более кэшируемым, и, следовательно, будут работать быстрее, когда вам придется попадать на диск.
Других решений пока нет …