面向文档的dbms作为主数据库,RDBMS数据库作为辅助数据库?

时间:2011-10-12 19:47:34

标签: mysql ruby-on-rails database solr document-oriented-db

由于它的规范化,我在MySQL数据库方面遇到了一些性能问题。

我使用数据库的大多数应用程序都需要执行一些繁重的嵌套查询,在我的情况下需要花费很多时间。查询可能需要2秒才能运行,带有索引。没有索引约45秒。

几个月前我遇到的一个解决方案是使用更快的线性文档数据库,在我的情况下,Solr作为主数据库。一旦MySQL数据库中的某些内容发生了变化,就会通知Solr。

这非常棒。使用Solr数据库的所有查询仅花费大约 3ms

这些数字看起来不错,但我遇到了一些问题。

  • 庞大的数据库

MySQL数据库大约200mb,Solr db包含大约1.4Gb的数据。 每次我需要更改表/列时,数据库都需要重新编制索引,在本例中需要花费12个小时。

  • 很难在不获取wet的情况下呈现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"]
}

这迫使我构建一个可以传递给视图的活动记录对象。

我的问题

有没有更好的方法来解决问题? 某种能够快速处理复杂查询的超级快速主要只读数据库会很不错。

2 个答案:

答案 0 :(得分:8)

Solr各个字段更新

关于对模式更改的所有重建索引:Solr does not support updating individual fields但是有一个JIRA issue关于此仍未解决。但是,您有多少次更改架构?

MongoDB的

如果没有RDBMS(没有连接,模式,事务,外键约束),可以使用基于文档的数据库,如MongoDB, 或CouchDB将是一个完美的契合。 (here是他们之间的一个很好的比较)

为什么要使用MongoBD:

  • 数据采用原生格式(您可以在视图中直接使用Mongoid等ORM映射器,因此您不需要像使用Solr一样调整记录)
  • dynamic queries
  • 非全文搜索查询的良好表现
  • 无架构(无需迁移)
  • 内置,易于设置replication

为什么要使用SOLR:

  • 高级,高效的全文搜索

为什么要使用MySQL

  • 加入,约束,交易

解决方案

因此,解决方案(组合)将是:

  1. 使用MongoDB + Solr

    • 但您仍需要重新索引所有架构更改
  2. 仅使用MongoDB

    • 但不支持高级全文搜索
  3. 在主从配置中使用MySQL,并平衡从服务器的读取(使用像octupus这样的插件)+ Solr

    • 设置复杂性
  4. 保持当前设置,在MySQL中对数据进行非规范化

    • 凌乱
  5. Solr重建索引慢度

      

    MySQL数据库大约200mb,Solr db包含大约1.4Gb   数据。每次我需要更改数据库需要的表/列   重新编制索引,在这个例子中花费了12个小时。

    在Solr中重新索引200MB DB 不应该需要12个小时!很可能你还有其他问题,如:

    MySQL的:

    SOLR:

    • 在每个请求之后提交 - 这是默认设置,你使用像太阳黑子这样的插件,但它是perf killer for production

    来自http://outoftime.github.com/pivotal-sunspot-presentation.html

      
        
    • 默认情况下,Sunspot :: Rails在每个请求结束时提交   更新Solr索引。把它关掉。
        
          
      • 使用Solr的autoCommit   功能。这是在solr / conf / solrconfig.xml
      • 中配置的   
      • 成为   很高兴假设不一致。不要在结果需要的地方使用搜索   是最新的。
      •   
    •   
    • 其他设置问题(http://wiki.apache.org/solr/SolrPerformanceFactors#Indexing_Performance)

    查看日志了解更多详情

答案 1 :(得分:1)

为什么不在MySQL数据库中创建一个针对只读访问进行优化的单独表,而不是将数据推送到Solr中以平展记录。

你似乎也反驳了自己

  

视图依赖于某个对象。它不关心它自己的对象是Active Record对象还是Solr对象,只要它可以在它上面调用一组属性。

     

我的问题是从Solr返回的数据是平的...这迫使我构建一个可以由视图呈现的虚假活动记录对象。