Индексирование «последней добавленной» строки набора строк - PullRequest
0 голосов
/ 10 января 2019

У меня есть база данных с 1Mil + строк в нем. Эта база данных состоит (ради этого вопроса) из 2 столбцов; user_id и имя пользователя. Эти значения не контролируются моим приложением; Я не всегда уверен, что это текущие правильные значения. Все, что я знаю, это то, что user_id гарантированно будет уникальным. Я получаю периодические обновления, которые позволяют мне обновлять базу данных, чтобы у меня была «в конечном итоге согласованная» версия сопоставления user_id / username.

Я хотел бы иметь возможность получить последнее добавление определенного имени пользователя; «старые» результаты следует игнорировать.

Я считаю, что здесь есть два возможных подхода: - индексирование: должен быть индекс username:row (hashmap?), где username всегда является последним добавленным именем пользователя; поэтому обновляется при каждом добавлении строки или обновлении - Установка имени пользователя как уникального и выполнение on conflict update для установки старой строки на пустую строку, а новой строки на имя пользователя

Из того, что я понял об индексировании, похоже, что это более быстрый вариант (и мне не нужно проверять уникальность строк 1Mil в моей базе данных). Я также слышал, что хэш-карты - это боль, потому что они требуют перестройки, поэтому не стесняйтесь высказывать другие идеи.

Моя текущая реализация выполняет полный поиск по всей базе данных, которая начинает становиться довольно медленной в 1Mil + строках. В настоящее время он получает «последнее» значение этой добавленной строки; что я даже не уверен, является ли допустимым предположением на данный момент.

Для примера базы данных:

user_id, username
3      , bob
2      , alice
4      , joe
1      , bob
Я ожидаю, что поиск `username = bob` вернется (1, bob). Я не могу полагаться на порядок идентификаторов, чтобы решить эту проблему, так как нет никакой линейности, какой идентификатор назначен какому имени пользователя.

1 Ответ

0 голосов
/ 10 января 2019

Вы можете сделать это, используя:

select distinct on (id) s.*
from sample s
where s.username = 'bob'
order by s.id desc;

Для производительности вам нужен индекс на sample(username, id).

В качестве альтернативы, если вы выполняете периодические массовые обновления, вы можете создать версию таблицы с уникальными строками для имени пользователя :

create table most_recent_sample as
    select max(id) as id, username
    from sample
    group by username;

create index idx_most_recent_sample_username on most_recent_sample(username);

Это может занять немного времени, но вы все равно делаете обновление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...