Улучшение производительности запросов таблицы базы данных с большим количеством столбцов и строк (50 столбцов, 5 мм строк)
Мы создаем решение для кэширования наших пользовательских данных. В настоящее время данные хранятся в sybase и распределяются по 5 - 6 таблицам, но на основе этого построен сервис запросов, использующий hibernate, и мы получаем очень низкую производительность. Чтобы загрузить данные в кеш, потребуется от 10 до 15 часов.
Поэтому мы решили создать денормализованную таблицу из 50–60 столбцов и 5-миллиметровых строк в другую реляционную базу данных (UDB), сначала заполнить эту таблицу, а затем заполнить кэш из новой денормализованной таблицы, используя JDBC, чтобы время для создания нашего кеша было меньше, Это дает нам гораздо лучшую производительность, и теперь мы можем построить кеш примерно за час, но это также не соответствует нашему требованию построения кеша за 5 минут. Денормированная таблица запрашивается с помощью следующего запроса
select * from users where user id in (...)
Здесь идентификатор пользователя является первичным ключом. Мы также попробовали запрос
select * from user where user_location in (...)
и создал не уникальный индекс на месте, но это также не помогло.
Так есть ли способ сделать запросы быстрее. Если нет, то мы также открыты для рассмотрения некоторых решений NOSQL.
Какое решение NOSQL подойдет для наших нужд. Помимо большого стола, мы будем ежедневно делать около 1 мм обновлений на столе.
Я читал о mongo db и кажется, что это может сработать, но никто не опубликовал никакого опыта с mongo db с таким количеством строк и таким количеством ежедневных обновлений.
Пожалуйста, дайте нам знать ваши мысли.
1 ответ
Краткий ответ здесь, касающийся MongoDB, - да - его можно использовать таким образом для создания денормализованного кэша перед СУБД. Другие использовали MongoDB для хранения наборов данных схожего (и большего) размера с тем, который вы описали, и могут хранить набор данных такого размера в оперативной памяти. Здесь отсутствуют некоторые детали в отношении ваших данных, но они определенно не выходят за рамки возможностей MongoDB и являются одной из наиболее часто используемых реализаций:
http://www.mongodb.org/display/DOCS/The+Database+and+Caching
Ключом будет размер вашего рабочего набора данных и, следовательно, доступной оперативной памяти (MongoDB отображает данные в память). Для более крупных решений, написания масштабного масштабирования и аналогичных проблем можно использовать множество подходов (сегментирование, наборы реплик).
Учитывая уровень детализации, трудно сказать наверняка, что MongoDB удовлетворит все ваши требования, но, учитывая, что другие уже сделали аналогичные реализации и на основании предоставленной информации нет никаких причин, по которым он также не будет работать.