优化Rails数据库搜索

时间:2011-11-18 19:29:06

标签: ruby-on-rails database optimization indexing tradeoff

我正在构建一个rails项目,我有一个包含一组表的数据库..每个表包含500k到1M行,我不断创建新行。

根据项目的性质,在每次创建之前,我必须在表中搜索重复项(对于一个字段),因此我不会创建两次相同的行。不幸的是,随着我的桌子越来越大,这需要更长的时间。

我想我可以通过向我正在搜索的特定字符串字段添加索引来优化搜索。但我听说添加索引会增加创建时间。

所以我的问题如下: 查找和创建包含索引字段的行的权衡是什么?我知道在字段中添加索引会使我的程序使用Model.find_by_name更快..但是我的行创建速度会慢多少?

1 个答案:

答案 0 :(得分:2)

索引会减慢条目的插入,因为它需要将条目添加到索引并且需要一些资源但是一旦添加它们就会加快您的选择查询,就像你说 BUT 可能是b-树不是你的正确选择!因为B树索引索引主题的前X个单位。如果你有整数,这很好,但文本搜索很棘手。当您执行

等查询时
Model.where("name LIKE ?", "#{params[:name]}%")

它会加快选择速度,但是当你使用这样的查询时:

Model.where("name LIKE ?", "%#{params[:name]}%")

它不会帮助你,因为你必须搜索整个字符串,这可能超过几百个字符,然后它不是一个改进,让250个字符串长字符串的前8个单位索引!这就是一件事。但是另一个......

您应该添加一个UNIQUE INDEX,因为数据库更好地查找重复项,然后是ruby!它针对分类进行了优化,并且确定了处理这个问题的更短更清洁的方法!因为你还应该为相关模型添加一个验证,但这并不是让数据库存在的理由。

//关于索引速度

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

你没有很多选择。当你只需要一个索引时,我不认为插入速度损失会很大!但选择速度会增加propotionall!