Apache Ignite 索引性能
Apache Ignite indexing performance
我有一个缓存,其中字符串作为键,TileKey(下面的class)作为值,我注意到当我执行查询(下面)时,性能几乎受到缓存的线性影响大小,即使查询中使用的所有字段都已编入索引。
这是一个具有代表性的基准测试 - 我对所有基准测试使用了具有相同参数的相同查询(如下):
查询returns(相同)所有基准测试中的 30 个条目
- 查询 5350 个条目缓存需要 6-7 毫秒
- 查询 10700 个条目缓存需要 8-10 毫秒
- 查询 48150 个条目缓存需要 30-42 毫秒
- 查询 96300 个条目缓存需要 50-70 毫秒
我用 8gb 单节点和 4gb 2 节点执行了基准测试,结果几乎相同(就查询速度与缓存大小而言)
我也尝试过使用 QuerySqlFieldGroup,将 "time" 字段用作第一组字段,它应该将所有基准测试中的结果集减少到只有 1000 个条目,我不确定这是不是根据我的理解,QuerySqlFieldGroup 的正确用法应该主要用于缓存之间的连接查询。
我是不是做错了什么,或者这些是使用 Ignite 索引的预期查询性能?
代码:
String strQuery = "time = ? and zoom = ? and x >= ? and x <= ? and y >= ? and y <= ?";
SqlQuery<String, TileKey> query= new SqlQuery<String, TileKey>(TileKey.class, strQuery);
query.setArgs(time, zoom, xMin,xMax,yMin, yMax);
QueryCursor<Entry<String, TileKey>> tileKeyCursor = tileKeyCache.query(query);
Map<String, TileKey> tileKeyMap = new HashMap<String, TileKey>();
for (Entry<String, TileKey> p : keysCursor) {
tileKeyMap.put(p.getKey(), p.getValue());
}
缓存配置:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="KeysCache" />
<property name="cacheMode" value="PARTITIONED" />
<property name="atomicityMode" value="ATOMIC" />
<property name="backups" value="0" />
<property name="queryIndexEnabled" value="true"/>
<property name="indexedTypes">
<list>
<value>java.lang.String</value>
<value>org.ess.map.TileKey</value>
</list>
</property>
</bean>
Class :
@QueryGroupIndex.List(@QueryGroupIndex(name = "idx1"))
public class TileKey implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 0)
private int time;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 1)
private int zoom;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 2)
private int x;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 3)
private int y;
@QuerySqlField(index = true)
private boolean inCache;
}
找到问题了,谢谢bobby_brew指引我正确的方向
indexing example of Ignite is incorrect, there is an open issue一下吧。
我更改了
中的索引字段注释
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = x)
到
@QuerySqlField(index = true, orderedGroups = {@QuerySqlField.Group(name = "idx1", order = x)})
现在查询持续时间在所有情况下都是稳定的 2ms
我有一个缓存,其中字符串作为键,TileKey(下面的class)作为值,我注意到当我执行查询(下面)时,性能几乎受到缓存的线性影响大小,即使查询中使用的所有字段都已编入索引。
这是一个具有代表性的基准测试 - 我对所有基准测试使用了具有相同参数的相同查询(如下): 查询returns(相同)所有基准测试中的 30 个条目
- 查询 5350 个条目缓存需要 6-7 毫秒
- 查询 10700 个条目缓存需要 8-10 毫秒
- 查询 48150 个条目缓存需要 30-42 毫秒
- 查询 96300 个条目缓存需要 50-70 毫秒
我用 8gb 单节点和 4gb 2 节点执行了基准测试,结果几乎相同(就查询速度与缓存大小而言)
我也尝试过使用 QuerySqlFieldGroup,将 "time" 字段用作第一组字段,它应该将所有基准测试中的结果集减少到只有 1000 个条目,我不确定这是不是根据我的理解,QuerySqlFieldGroup 的正确用法应该主要用于缓存之间的连接查询。
我是不是做错了什么,或者这些是使用 Ignite 索引的预期查询性能?
代码:
String strQuery = "time = ? and zoom = ? and x >= ? and x <= ? and y >= ? and y <= ?";
SqlQuery<String, TileKey> query= new SqlQuery<String, TileKey>(TileKey.class, strQuery);
query.setArgs(time, zoom, xMin,xMax,yMin, yMax);
QueryCursor<Entry<String, TileKey>> tileKeyCursor = tileKeyCache.query(query);
Map<String, TileKey> tileKeyMap = new HashMap<String, TileKey>();
for (Entry<String, TileKey> p : keysCursor) {
tileKeyMap.put(p.getKey(), p.getValue());
}
缓存配置:
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="KeysCache" />
<property name="cacheMode" value="PARTITIONED" />
<property name="atomicityMode" value="ATOMIC" />
<property name="backups" value="0" />
<property name="queryIndexEnabled" value="true"/>
<property name="indexedTypes">
<list>
<value>java.lang.String</value>
<value>org.ess.map.TileKey</value>
</list>
</property>
</bean>
Class :
@QueryGroupIndex.List(@QueryGroupIndex(name = "idx1"))
public class TileKey implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 0)
private int time;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 1)
private int zoom;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 2)
private int x;
@QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = 3)
private int y;
@QuerySqlField(index = true)
private boolean inCache;
}
找到问题了,谢谢bobby_brew指引我正确的方向
indexing example of Ignite is incorrect, there is an open issue一下吧。
我更改了
中的索引字段注释 @QuerySqlField(index = true)
@QuerySqlField.Group(name = "idx1", order = x)
到
@QuerySqlField(index = true, orderedGroups = {@QuerySqlField.Group(name = "idx1", order = x)})
现在查询持续时间在所有情况下都是稳定的 2ms