6 / 5 / 0
Регистрация: 28.09.2010
Сообщений: 366
|
|
1 | |
Как работать с большой базой данных?23.11.2018, 14:40. Показов 1144. Ответов 6
Метки нет (Все метки)
Добрый день.
Бэк java+spring. БД hbase через apache phoenix. В базе 10млн записей. С фронта приходит 10.000 идентификаторов записей (только для примера, по факту может быть 100.000 или больше). Надо проверить есть ли запись в базе. Сейчас реализация такова, что сначала в лист джавы вытаскиваются все записи, и потом идет проверка по листу. Это занимает огромное количество времени из-за работы с hbase через phoenix. По факту больше 10 минут ( только чтобы вытащить все записи в лист). Подскажите пожалуйста как подобную работу оптимизировать. Спасибо.
0
|
23.11.2018, 14:40 | |
Ответы с готовыми решениями:
6
Как работать с базой данных? Многопользовательское приложение, как работать с базой данных Как работать с базой данных? Как работать c базой данных? |
Am I evil? Yes, I am!
17566 / 10320 / 2819
Регистрация: 21.10.2017
Сообщений: 22,375
|
|
23.11.2018, 16:34 | 2 |
Зачем все вытаскивать? У JpaRepository есть метод
boolean existsBy...
0
|
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,589
|
|
23.11.2018, 17:22 | 3 |
Насколько я знаю про HBase и подобные БД, они медленно работают с такими операциям как «вытащить все записи», поэтому может оказаться эффективней вытаскивать записи по имеющимся идентификаторам. Наверняка это можно делать не по одному запросу на каждую запись, а пачками (batch get), по несколько идентификаторов за раз. Или, если идентификаторы упорядочены, использовать scan.
Добавлено через 5 минут Ты же не будешь вытаскивать все записи, когда в базе их будет не 10млн, а 10млрд или 10трлн?
0
|
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
|
|
23.11.2018, 18:41 | 4 |
select ... where id in (лист, который приходит)
0
|
6 / 5 / 0
Регистрация: 28.09.2010
Сообщений: 366
|
|
23.11.2018, 23:40 [ТС] | 5 |
Ну одно сделать один объемный запрос к базе, а другое сделать 10.000 запросов к базе.
Каковы результаты с точки зрения оптимизации?
0
|
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,589
|
|
23.11.2018, 23:51 | 6 |
Да, это разные дела. HBase и Cassandra, например, плохо и медленно делают «один объёмный запрос», но хорошо много маленьких.
Результаты таковы: пишешь бенчмарки и меряешь. Добавлено через 5 минут Ну или попробуй так (обрати внимание на комментарий про setCaching), т.е., делаешь из своего списка ID'шников Set, потом проходишь по таблице, как описано по ссылке, и проверяешь, есть ли ключ из таблицы в твоём Set'е.
0
|
2398 / 2223 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
|
|
24.11.2018, 11:53 | 7 |
Нет смысла вытаскивать все данные если интересует только факт наличия.
Самая простая оптимизация это вытаскивать только ids и затем сравнивать. Если пойти дальше, можно подумать что в большинстве случаев записи скорее всего будут в БД чем будут отсутствовать, то есть при входных данных размера N, если разделить его на части N/M то с высокой вероятностью каждая часть из N/M будет полностью присутствовать в БД. Таким образом можно делать запрос на count(id) where id in(part_list) и сравнивать счетчик с размером листа. Если он одинаковый, проходим дальше, если нет, запускаем либо бинарный поиск (само собой должна быть сортировка по id) либо селектим все ids (тут можно померять что быстрее). обычно один запрос лучше чем много т.к при каждом запросе есть доп. расходы связанные со взятием подключения из пула, синхронизацией и ещё всякой хренью.
0
|
24.11.2018, 11:53 | |
24.11.2018, 11:53 | |
Помогаю со студенческими работами здесь
7
Как работать с базой данных? Как работать с базой данных? Как подключиться и работать с базой данных Как работать с базой данных MySQL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |