У меня есть веб-приложение, одной из функций которого является постоянное добавление строк в большую таблицу. Строки выглядят примерно так:
id bigint not null primary key
visited datetime not null
ip_address
# Other fields
Это таблица отслеживания, как вы, наверное, догадались. Использование этой таблицы
полностью добавляется только для добавления, то есть после изменения
был вставлен.
Однако наш объем данных значительно увеличился, и это стало необходимым
выполнять обработку статистики отдельно в другие таблицы, а не запрашивать
данные и вычисления это сразу. В основном я написал отдельную программу
что примерно делает это (псевдокод)
while (true) {
Select rows from tracking table where id > last_id
Feed rows to stats processing thread
last_id = max(id from rows)
sleep some amount of time (~30sec is what I'm currently using)
}
Однако я волнуюсь, что пропущу строки. Разрыв в идентификационных данных может произойти, потому что
в то время, когда я выбираю строки из таблицы отслеживания, некоторые из идентификаторов строк имеют
были зарезервированы, но данные в этих транзакциях еще не были зафиксированы, и
В следующем цикле я уже перешел на новые идентификаторы.
Мне было интересно, как с этим смириться, поскольку отсутствующие данные при вычислении
статистика на самом деле не вариант.
Вот различные варианты, которые я подбрасывал:
Перепроектирование таблицы или запроса на что-то вроде времени посещения
Не используете реляционную БД, а какую-то систему очередей данных?
Запросить таблицу с задержкой по времени, т. Е. Идентификатор WHERE> last_id И посещен
Также возможно, что есть вариант, который я не рассматривал. Что лучше
способ запроса таблицы, чтобы я не пропустил никаких данных?