0

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

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

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

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

4

1 回答 1

2

索引会减慢条目的插入速度,因为它需要将条目添加到索引中并且需要一些资源,但是一旦添加它们就会加快您的选择查询,就像您说的那样,也许 b-tree 不是您的正确选择!因为 B-Tree 索引了索引主题的前 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

你没有大量的选择。当您只需要一个索引时,我认为插入速度损失不会那么大!但是选择速度会增加比例!

于 2011-11-18T20:22:46.810 回答