我有一个模型A通过INNER JOIN与模型B相关联:
class A
has_many :bees, as: :bable
scope :bees, -> () {
joins("INNER JOIN bees AS b ON id = b.bable_id .......")
}
end
class B
table_name = "bees"
belongs_to :bable, polymorphic: true
end
我需要使用B的datetime字段(created_at)进行过滤,因此我声明了一个新属性:
has bees.created_at, as: :b_created_at
现在生成的sphinx查询语句包括:
GROUP_CONCAT(DISTINCT UNIX_TIMESTAMP(bees.`created_at`) SEPARATOR ',') AS `b_created_at`
索引编制后,我的sphinx索引文件大小爆炸了。
由于
答案 0 :(得分:1)
索引器似乎在索引文件中创建了一个逗号分隔的列表,其中列出了所有bees
的所有已创建时间戳 - 因为创建的时间戳通常是唯一的(!),此索引将创建一个项目对于每个bee
。如果你有很多bees
那么这将会很大。
如果有可能的话,我会想办法绕过Sphinx这部分查询,并让它为内置的BETWEEN LowDateTs AND HighDateTs
添加一个直接的SQL created_at
。我希望这是可能的 - 它肯定比使用文本索引找到它更好。
希望这有一些帮助。
修改强>
快速阅读Sphinx'文档:
[...] WHERE子句。该子句将映射到全文查询和过滤器。比较运算符(=,!=,<,>,< =,> =),IN,AND,NOT和BETWEEN都支持并直接映射到过滤器[...]
所以关键是要停止将时间戳视为文本搜索,并使用BETWEEN
,这将更有效率,并希望阻止它尝试在此字段上使用文本索引。