我们有一个方案来评估LIKE搜索索引(范围)的密钥(限制为100)。查询使用索引,但查询的性能会根据“key”返回的匹配数而有所不同。
即如果搜索更具体,则查询需要更长时间,如果搜索是通用的(并且具有更多结果),则返回更快(可能是因为它获得前100个更快)。 对于具有400k记录的复制区域,结果范围为1ms至5分钟。 例如查询 select * from / REGION where where'%SEARCH_STRING%' 有趣的是,开头的%会导致问题。如果我们删除它,它会以毫秒为单位返回。在任何一种情况下,'indexesUsed'都会返回正确的索引。
看起来我们遗漏了索引的基本内容,或索引有一种奇怪的行为。
注意:Gemfire版本:8.2.0,Spring-data:1.8.5。此问题可以直接在gfsh中使用查询重现。所以与spring-data层无关。
答案 0 :(得分:3)
前缀%导致您扫描整个索引。当你删除前缀%时,你实际上是使用索引跳转到(范围索引的)起点并从那里扫描。
我在您的查询中注意到的另一件事是您正在使用"选择*"。你真的需要序列化整个记录吗?如果启用PDX并只选择所需的字段,您将获得更好的性能。
您报告说它正在使用索引,即使它有效地进行了扫描。如果您没有启用PDX并且它实际上没有使用索引,则反序列化所有记录可能是一个问题(因为您有select *)或者由于扫描而JVM受内存限制。 / p> 威斯威廉姆斯
P.S。直接从开发者那里获得帮助的有效方法是将问题发布在geode用户列表中。