MySQLデータベースが正規化されているため、パフォーマンスの問題が発生しています。
データベースを使用する私のアプリケーションのほとんどは、いくつかの重いネストされたクエリを実行する必要があります。私の場合、これには多くの時間がかかります。インデックスを使用すると、クエリの実行に最大2秒かかる場合があります。インデックスなしで約45秒。
数か月前に私が思いついた解決策は、より高速でより線形なドキュメントベースのデータベース(私の場合はSolr)をプライマリデータベースとして使用することでした。MySQLデータベースで何かが変更されるとすぐに、Solrに通知されました。
これは本当にうまくいきました。Solrデータベースを使用するすべてのクエリは、約3ミリ秒しかかかりませんでした。
数字は良さそうですが、問題があります。
- 巨大なデータベース
MySQLデータベースは約200MBで、Solrデータベースには約1.4Gbのデータが含まれています。テーブル/列を変更する必要があるたびに、データベースのインデックスを再作成する必要があります。この例では、12時間以上かかりました。
- 濡れることなくSolrオブジェクトとActiveRecord(MySQL)オブジェクトの両方をレンダリングすることは困難です。
ビューは特定のオブジェクトに依存しています。オブジェクト自体がActiveRecordオブジェクトであるか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"]
}
これにより、ビューに渡すことができるアクティブなレコードオブジェクトを作成する必要があります。
私の質問
問題を解決するためのより良い方法はありますか?複雑なクエリを高速に処理できる、ある種の超高速プライマリ読み取り専用データベースがあれば便利です。