由于它的规范化,我在MySQL数据库方面遇到了一些性能问题。
我使用数据库的大多数应用程序都需要执行一些繁重的嵌套查询,在我的情况下需要花费很多时间。查询可能需要2秒才能运行,带有索引。没有索引约45秒。
几个月前我遇到的一个解决方案是使用更快的线性文档数据库,在我的情况下,Solr作为主数据库。一旦MySQL数据库中的某些内容发生了变化,就会通知Solr。
这非常棒。使用Solr数据库的所有查询仅花费大约 3ms 。
这些数字看起来不错,但我遇到了一些问题。
MySQL数据库大约200mb,Solr db包含大约1.4Gb的数据。 每次我需要更改表/列时,数据库都需要重新编制索引,在本例中需要花费12个小时。
视图依赖于某个对象。它不关心它自己的对象是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"]
}
这迫使我构建一个可以传递给视图的活动记录对象。
我的问题
有没有更好的方法来解决问题? 某种能够快速处理复杂查询的超级快速主要只读数据库会很不错。
答案 0 :(得分:8)
关于对模式更改的所有重建索引:Solr does not support updating individual fields但是有一个JIRA issue关于此仍未解决。但是,您有多少次更改架构?
如果没有RDBMS(没有连接,模式,事务,外键约束),可以使用基于文档的数据库,如MongoDB, 或CouchDB将是一个完美的契合。 (here是他们之间的一个很好的比较)
为什么要使用MongoBD:
为什么要使用SOLR:
为什么要使用MySQL
因此,解决方案(组合)将是:
使用MongoDB + Solr
仅使用MongoDB
在主从配置中使用MySQL,并平衡从服务器的读取(使用像octupus这样的插件)+ Solr
保持当前设置,在MySQL中对数据进行非规范化
MySQL数据库大约200mb,Solr db包含大约1.4Gb 数据。每次我需要更改数据库需要的表/列 重新编制索引,在这个例子中花费了12个小时。
在Solr中重新索引200MB DB 不应该需要12个小时!很可能你还有其他问题,如:
MySQL的:
SOLR:
来自http://outoftime.github.com/pivotal-sunspot-presentation.html:
- 默认情况下,Sunspot :: Rails在每个请求结束时提交 更新Solr索引。把它关掉。
- 使用Solr的autoCommit 功能。这是在solr / conf / solrconfig.xml
中配置的- 成为 很高兴假设不一致。不要在结果需要的地方使用搜索 是最新的。
查看日志了解更多详情
答案 1 :(得分:1)
为什么不在MySQL数据库中创建一个针对只读访问进行优化的单独表,而不是将数据推送到Solr中以平展记录。
你似乎也反驳了自己
视图依赖于某个对象。它不关心它自己的对象是Active Record对象还是Solr对象,只要它可以在它上面调用一组属性。
我的问题是从Solr返回的数据是平的...这迫使我构建一个可以由视图呈现的虚假活动记录对象。