由于 MySQL 数据库的规范化,我遇到了一些性能问题。
我的大多数使用数据库的应用程序都需要执行一些繁重的嵌套查询,在我的情况下这需要很多时间。带有索引的查询可能需要 2 秒才能运行。没有索引大约 45 秒。
几个月前我遇到的一个解决方案是使用更快、更线性的基于文档的数据库,在我的例子中是 Solr,作为主数据库。一旦 MySQL 数据库中的某些内容发生更改,Solr 就会收到通知。
这真的很棒。使用 Solr 数据库的所有查询只用了大约3ms。
数字看起来不错,但我遇到了一些问题。
- 庞大的数据库
MySQL 数据库大约 200mb,Solr db 包含大约 1.4Gb 的数据。每次我需要更改表/列时,都需要重新索引数据库,在此示例中需要 12 多个小时。
- 很难在不弄湿的情况下同时渲染 Solr 对象和 Active Record (MySQL) 对象。
视图依赖于某个对象。它不关心它自己的对象是 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"]
}
这迫使我构建一个可以传递给视图的活动记录对象。
我的问题
有没有更好的方法来解决问题?某种可以快速处理复杂查询的超级快速主只读数据库会很好。