|
|
|
Вопрос по оптимальной структуре БД
|
|||
|---|---|---|---|
|
#18+
Нужна таблица примерно из трех полей: KEY, TIMESTAMP, VALUE Данные только добавляются, запросы только по KEY, нужно вернуть данные с последним TIMESTAMP. Как это эффективно сделать в PostgreSQL ? 1) Табличка в которую INSERT only + какой нибудь хитрый SELECT (что эффективнее?) 2) Табличка с данными INSERT only + табличка в которой хранить KEY+VALUE последнего значения и UPDATE Кто-что может по опыту работы с PostgreSQL посоветовать? Насколько AutoVacum сейчас эффективно работает, не будет ли табличка, которую постоянно update'ят, безумно тормозить? Объемы: Уникальный KEY от 100 000 до нескольких миллионов. Размер Value от 15 кб до 150 кб. Активное обновление. Достаточно активное чтение (отношение обновление - чтение наверное 1:1, т.к. поверх в аппликейшен слое будет еще кэш прикручен). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 19:46 |
|
||
|
Вопрос по оптимальной структуре БД
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, если в среднем запись с одним key несколько раз обновляется, и данных будет достаточно много, то второй вариант. т.е. таблица с последними часто читаемыми данными отдельно и триггер в ней, который в insert only таблицу пишет при update/insert. автовакуум при должной настройке будет работать, но нужно следить чтобы не было длинных транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 22:11 |
|
||
|
Вопрос по оптимальной структуре БД
|
|||
|---|---|---|---|
|
#18+
Leonid, Я бы перед тем как перейти к варианту со второй таблицей, попробовал сделать индекс по key, timestamp. Ну и запрос select * from t where key = ? order by timestamp desc limit 1; Тестовый пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Со значением value я, конечно, сильно утрирую. Постгрес такие штуки, как repeat(), умеет хорошо сжимать при хранении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 12:52 |
|
||
|
Вопрос по оптимальной структуре БД
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, Очередность таймстампа неоднозначна - таймстампы могут и совпасть и другая неприятность, более ранний таймстамп может закомититься позже. В случае второй таблицы надо иметь ввиду, что доступ к одному KEY будет сериализован на блокировке строки и тот самый более ранний по значения TIMESTAMP может оказаться последним. Этого можно избежать, если проверять заменяемое значение при апдейте. Вообще, правильнее рассматривать такой подход наоборот - есть основная таблица с актуальными данными KEY-VALUE, а с TIMESTAMP вторична как журнал значений. Еще вариант реализации - использовать дополнительный признак актуальности в той же таблице. Для доступа использовать частичный индекс. Внесение значения тогда заключается в сбросе признака текущей актуальной строки (update) и вставке новой. Но тут проблема сериализации усугбляется тем, что бывшая актуальной на момент старта двух конкурентных обновлений строка переезжает после коммита первенца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 13:48 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=1997529]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
12ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 384ms |

| 0 / 0 |
