У меня проблемы с производительностью базы данных MySQL из-за ее нормализации.
Большинству моих приложений, использующих базу данных, необходимо выполнять несколько сложных вложенных запросов, что в моем случае занимает много времени. Запросы могут занять 2 секунды, с индексами . Без индексов около 45 секунд.
Решение, которое я нашел несколько месяцев назад, состояло в том, чтобы использовать более быструю, более линейную базу документов, в моем случае Solr, в качестве основной базы данных. Как только что-то изменилось в базе данных MySQL, Solr получил уведомление.
Это сработало очень хорошо. Все запросы с использованием базы данных Solr занимали около 3ms .
Числа выглядят хорошо, но у меня есть некоторые проблемы.
База данных MySQL составляет около 200 МБ, база данных Solr содержит около 1,4 ГБ данных.
Каждый раз, когда мне нужно изменить таблицу / столбец, базу данных необходимо переиндексировать, что в этом примере заняло более 12 часов.
- Сложно отобразить как объект Solr, так и объект Active Record (MySQL) без получения wet .
Представление опирается на определенный объект. Не имеет значения, является ли сам объект Active Record или объектом Solr, если он может вызывать для него набор атрибутов.
Вот так.
# Controller
@song = Song.first
# View
@song.artist.urls.first.service.name
Проблема в моем случае заключается в том, что данные, возвращаемые из Solr, выглядят как плоские.
{
id: 123,
song: "Waterloo",
artist: "ABBA",
service_name: "Groveshark",
urls: ["url1", "url2", "url3"]
}
Это вынуждает меня создать объект активной записи, который можно передать в представление.
Мой вопрос
Есть ли лучший способ решить проблему?
Неплохая быстрая первичная база данных только для чтения, которая может быстро обрабатывать сложные запросы.